2011-11-16 57 views
2

我想知道的区别:SQL Server在Join语句中加入条件?

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) 
+1

@marc_s - 我读这是一个错字,并意在T2.id,如果这意味着别的东西,我得打编辑:) – Andrew

+1

@marc_s是啊我修好了。 –

+0

你的答案可能是[here](http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference) – misha

回答

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) 

这意味着它将会生效,并且过滤器,可连接至使用左侧加入了行,但不会造成当左连接到被丢弃的行无法找到匹配的行。