【问题标题】:SQL Query To find Train between stationsSQL查询查找车站之间的火车
【发布时间】:2013-06-28 10:22:17
【问题描述】:

这是我的火车时刻表我想要一个车站之间的火车解决方案

Train  Code
15609  ABC
15609  XYZ
15609  PQR  
15609  ADI  
15609  QWE   
15609  XPM   
15609  IND 
15680  ABC
15680  XYZ
15680  PQR  
15680  ADI  
15680  QWE   
15680  XPM   
15680  IND 

对于输出,用户将输入两个代码,例如:ABC 和 XYZ 并且输出将是代码为ABC 和XYZ 的所有列车号。

【问题讨论】:

    标签: asp.net sql sql-server


    【解决方案1】:

    这应该可以解决问题。它也应该表现良好——不需要 JOIN。

    SELECT
       Train
    FROM
       dbo.TrainTime
    WHERE
       Code IN ('ABC', 'XYZ')
    GROUP BY
       Train
    HAVING
       Count(DISTINCT Code) = 2
    ;
    

    【讨论】:

    • 它比使用JOIN 的查询执行得更好。你有没有选择它的原因?
    【解决方案2】:

    我想你想要的是这样的

    select Train from mytable where Code = 'ABC'
    intersect
    select Train from mytable where Code = 'XYZ'
    

    SQL FIDDLE EXAMPLE

    【讨论】:

    • 我很困惑,表现不佳的查询是如何被选中并获得更多投票的?此查询需要JOIN,这不是必需的。比较execution plans at SQL Fiddle!我向你保证,在一张大桌子上,这将是一个非常显着的差异。此外,这不能轻易推广到任意数量的站点——查询必须大幅改变长度。
    • 虽然我可以(部分)同意泛化查询,但我认为我的查询更具可读性。性能取决于您在表上的索引。如果您正确完成索引,则两个查询的性能相同。我已经尝试使用索引对 ~200000 行进行两个查询,并且在我的查询中有 (reads:12, duration:0 and reads:16, duration:1) 所以它对我来说是相等的。而且我总是在编写查询时考虑到索引。如果您没有索引,则您的查询性能会更好,但无论如何,表扫描对于大量行来说是个坏主意。
    • 无论如何,这是我的 +1 回答,埃里克。
    • 在索引上足够公平。这是一个好点。两次寻找就是两次寻找。如果需要扫描,只有这样我们的两个查询才开始在性能上有所区别。但是,我的关于查询修改的 cmets 仍然存在。
    【解决方案3】:

    嗯,这很简单,也许太简单了:

    select distinct [Train] from mytable 
    where code = 'ABC' or code = 'XYZ'
    

    如果我误解了什么,请告诉我。

    【讨论】:

    • 它不能有或者我需要两个代码一起有共同的火车号码
    • 哦,我明白了,对不起。然后我建议使用下面建议的 Roman Pekar 之类的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2020-03-29
    • 2022-01-20
    • 2021-10-26
    • 2021-10-23
    • 2010-11-23
    相关资源
    最近更新 更多