两表关联取人员信息:没有地址的人也不能丢
LeetCode 175 · LEFT JOIN、保留主表
面试怎么回答
这道题考的是保留主表的关联方式。人员是主体、地址是可选信息,所以用 Person LEFT JOIN Address ON PersonId,左表全部保留,没有地址的人城市和州返回 NULL。如果后面还要筛选地址条件,我会把条件放在 ON 里,避免 WHERE 把补出来的空行过滤掉。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
人员表和地址表通过人员 ID 关联。要求列出每个人的名、姓、城市和州;有的人没有登记地址,这些人也必须出现在结果里,地址字段为空即可。
表结构
- Person:PersonId(主键)、FirstName、LastName
- Address:AddressId(主键)、PersonId、City、State
思路
关键词是「无论有没有地址都要返回」,也就是以人员表为主表、地址表只是补充信息,这正是 LEFT JOIN 的语义:左表每一行都保留,右表匹配不上的列填 NULL。用 INNER JOIN 会把没有地址的人直接过滤掉。
参考解法
select FirstName,LastName,City,State
from Person p
left join Address a
on a.PersonId = p.PersonId
易错点
- 用了 INNER JOIN 或者逗号连接 + WHERE,会丢掉没有地址的人。
- 如果要对地址加过滤条件(比如只要某个州),条件要写在 ON 里;写在 WHERE 里会把 LEFT JOIN 变回 INNER JOIN 的效果。