意外地将外部联接转换为内部联接

外连接返回一个或两个表中的所有行,以及匹配的行。

Table People
PersonID FirstName
       1 Alice
       2 Bob
       3 Eve

Table Scores
PersonID Subject Score
       1 Math    100
       2 Math     54
       2 Science  98

左边加入桌子:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID

返回:

PersonID FirstName PersonID Subject Score
       1 Alice            1 Math    100
       2 Bob              2 Math     54
       2 Bob              2 Science  98
       3 Eve           NULL NULL   NULL

如果你想归还所有人,并且有任何适用的数学分数,一个常见的错误就是写:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID
where Subject = 'Math'

除了删除 Bob 的科学分数之外,这将从你的结果中删除 Eve,因为 Subject 对她来说是 NULL

在保留 People 表中的所有个体的同时删除非 Math 记录的正确语法是:

Select * from People a
left join Scores b
on a.PersonID = b.PersonID
and b.Subject = 'Math'