如何在INNER JOIN之前执行WHERE子句

时间:2013-05-19 08:50:23

标签: sql sql-server inner-join

我怎么这样查询?

select Distinct  Station  , Slot , SubSlot, CompID , CompName 
from DeviceTrace as DT DT.DeviceID = '1339759958' 
inner join CompList as CL  
where  and DT.CompID = CL.CompID

在开始使用内连接之前,我需要DT.DeviceID = '1339759958'。 我使用sql server。

5 个答案:

答案 0 :(得分:7)

我发现很难相信这会有所不同。查询优化器应该在连接之前应用谓词,如果它计算出这样做更有效。您可能需要执行此操作的唯一情况是优化器做出错误选择(至少对于内部联接 - 外部联接有效的情况)。

答案 1 :(得分:4)

尝试添加ON子句。

SELECT DISTNCT Station, Slot, SubSlot, CompID, CompName 
FROM   DeviceTrace AS DT INNER JOIN CompList AS CL 
        ON  DT.CompID = CL.CompID AND
            DT.DeviceID = '1339759958'

在这种情况下,结果是相同的,因为您正在执行INNER JOIN。在执行ON并在右侧表格上进行过滤时,在LEFT JOIN子句中添加条件可能会有很大差异。

答案 2 :(得分:1)

David Aldridge回答的一个小小的澄清。您必须使用查询

select Distinct  Station  , Slot , SubSlot, CompID , CompName 
from DeviceTrace as DT 
inner join CompList as CL on DT.CompID = CL.CompID  
where DT.DeviceID = '1339759958'

答案 3 :(得分:0)

您可以使用子查询在where之前应用join子句:

select  *
from    (
        select  *
        from    DeviceTrace
        where   DeviceID = '1339759958' 
        ) as DT 
inner join 
        CompList as CL  
on      DT.CompID = CL.CompID

虽然在这种情况下,您是否在子查询,on子句或最终where中进行过滤无关紧要。

答案 4 :(得分:0)

你可以试试这个:

select Distinct Station, Slot, SubSlot, CompID, CompName 
from (select * from DeviceTrace where DeviceID = '1339759958') as DT  
inner join CompList as CL ON DT.CompID = CL.CompID