意外地将外部联接转换为内部联接
外连接返回一个或两个表中的所有行,以及匹配的行。
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'