假設我們有如下表結構:左加入含where子句INSIDE加入
DECLARE @Person TABLE
(
PersonId INT,
Name VARCHAR(50)
)
DECLARE @Address TABLE
(
AddressId INT IDENTITY(1,1),
PersonId INT
)
我們插入兩個人記錄:
INSERT INTO @Person (PersonId, Name) VALUES (1, 'John Doe')
INSERT INTO @Person (PersonId, Name) VALUES (2, 'Jane Doe')
,但我們只插入用於John
INSERT INTO @Address (PersonId) VALUES (1)
如果我執行以下查詢,我會得到不同的結果
SELECT *
FROM @Person p
LEFT JOIN @Address a
ON p.PersonId = a.PersonId AND a.PersonId IS NULL
PersonId | Name | AddressId | PersonId
1 | John Doe | NULL | NULL
2 | Jane Doe | NULL | NULL
VS
SELECT *
FROM @Person p
LEFT JOIN @Address a
ON p.PersonId = a.PersonId
WHERE a.PersonId IS NULL
PersonId | Name | AddressId | PersonId
2 | Jane Doe | NULL | NULL
爲什麼查詢返回不同的結果?
它變成了一個內部聯接:http://stackoverflow.com/questions/3256304/left-join-turns-into-inner-join –
因爲PersonID上的'LEFT JOIN'確實產生了一個匹配,並且PersonID不爲NULL那一排。 –