假设我们有如下表结构:左加入含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那一排。 –