我想知道的區別: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