SQL Server在Join语句中加入条件?

时间:2011-11-16 15:29:24

标签: sql-server

我想知道区别:

select * 
from Table1 T1 
left join Table1 T2 on T1.id = T2.id + 1 and (T2.id > 3) 

VS

select * 
from Table1 T1 
left join Table1 T2 on T1.id = T2.id + 1 
where (T2.id > 3)

2 个答案:

答案 0 :(得分:4)

存在显着差异。

select * from Table1 T1 left join  Table1 T2 on T1.id=T2.id+1     where    (T2>3 

where子句将左连接更改为内连接,因为它不允许从左连接返回空值。这意味着将排除左连接未找到匹配记录的所有行,因为返回的空值将与3进行比较并丢弃该行(这与使其成为内连接的效果相同)

第一个声明是在连接中应用过滤器:

select * from Table1 T1 left join  Table1 T2 on T1.id=T2.id+1     and     (T2>3)  

这意味着它将生效并使用左连接过滤可以连接到的行,但是当左连接无法找到匹配的行时,这不会导致丢弃行。

答案 1 :(得分:2)

INNER JOIN中,你所处的条件无关紧要 它只会对LEFT JOINRIGHT JOIN

产生影响

前段时间我写了一个类似问题的详细答案,解释了SQL Server在两种情况下的不同之处。

你可以在这里查看:
What is the difference in these two queries as getting two different result set?