院系不存在的学生:找出孤儿记录
LeetCode 1350 · 反连接、外键完整性检查
面试怎么回答
这是外键完整性检查,用 LEFT JOIN 院系表后取 d.id IS NULL,或者 NOT EXISTS。数仓里我会把这类检查做成数据质量规则,定期跑,发现孤儿记录就告警。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
院系表和学生表(学生记录了所属院系 ID)。找出所属院系在院系表里不存在的学生。
表结构
- Departments:id(主键)、name
- Students:id(主键)、name、department_id
思路
典型的反连接,用来做数据质量里的「外键完整性检查」:学生的院系 ID 不在院系表里。NOT IN、NOT EXISTS、LEFT JOIN + IS NULL 都可以。
参考解法
select id,name
from Students
where department_id not in
(
select id
from Departments
)
另一种写法:LEFT JOIN 写法
SELECT s.id, s.name
FROM Students s
LEFT JOIN Departments d ON s.department_id = d.id
WHERE d.id IS NULL
易错点
- 如果学生的 department_id 可能为空,NOT IN 和 LEFT JOIN 对它的处理不同:NOT IN 下 NULL 不会被选出,LEFT JOIN 写法会把它选出来,按业务决定。