收入超过经理的员工:表和自己关联
LeetCode 181 · 自连接
面试怎么回答
经理和员工在同一张表,用自连接。把表当成员工 a 和经理 b 两份,按 a.ManagerId = b.Id 关联,再筛选 a.Salary > b.Salary。没有经理的员工在内连接里会被排除,正好符合题意。
先把这段讲顺;面试官追问时,再展开下面的原理和细节。
详细讲解
题意
员工表里每个员工都有一个经理 ID,经理本身也是员工表里的一行。找出薪水比自己经理还高的员工姓名。
表结构
- Employee:Id(主键)、Name、Salary、ManagerId(经理也是员工,可能为空)
思路
员工和经理在同一张表里,用自连接:一份当员工 a,一份当经理 b,用 a.ManagerId = b.Id 关联,再比较两边薪水。没有经理的人 ManagerId 为 NULL,内连接自然把他们排除了。
参考解法
select a.Name Employee
from Employee a
join Employee b
on a.ManagerId = b.id
where a.Salary>b.Salary
易错点
- 关联条件写反成 a.Id = b.ManagerId,变成找「比下属收入高的人」。