我想知道的区别: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)
我想知道的区别: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)
有一个显著的差异。
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)
这意味着它将会生效,并且过滤器,可连接至使用左侧加入了行,但不会造成当左连接到被丢弃的行无法找到匹配的行。
在INNER JOIN
这是没有关系的地方放置条件。
它只在LEFT JOIN
或RIGHT JOIN
有所不同。
我前一段时间写了一个类似问题的详细答案,解释了SQL Server在您的两种情况下的不同之处。
你可以看看这里:
What is the difference in these two queries as getting two different result set?
@marc_s - 我读这是一个错字,并意在T2.id,如果这意味着别的东西,我得打编辑:) – Andrew
@marc_s是啊我修好了。 –
你的答案可能是[here](http://stackoverflow.com/questions/1018822/inner-join-versus-where-clause-any-difference) – misha