订阅更新

院系不存在的学生:找出孤儿记录

SQL 实战 123 题 · 第 97 题 简单 约 2 分钟读完

LeetCode 1350 · 反连接、外键完整性检查

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

这是外键完整性检查,用 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 写法会把它选出来,按业务决定。
刷题进度保存在当前浏览器