LeetCode 181. 超过经理收入的员工
题目描述


题意分析
Employee中每行记录一名员工,managerId指向其直属经理在同一张表中的id。找出薪水严格高于直属经理的员工,输出这些员工的姓名,列名为Employee,结果顺序不限。
解法:员工与经理自连接
核心思路
[!blue]
用自连接把员工和对应经理放到同一行。 将员工表引用两次,别名e1表示待检查的员工,e2表示经理。连接条件应为e1.managerId=e2.id,这样取得的才是这名员工的直属经理,而非任意其他员工。
id是主键,一名员工至多匹配一条经理记录。连接后用e1.salary>e2.salary筛选,恰好对应“员工比自己的经理收入高”;最后选择e1.name,输出的身份仍是员工这一侧。内连接只保留经理匹配成功的行。
managerId为NULL时无法通过等值连接,不会参与薪资比较,也不需要额外添加排除空经理的条件。相同薪水不满足严格大于,直接被过滤掉。
解题步骤
- 用
e1、e2两个别名引用Employee。- 按员工的
managerId匹配经理的id。- 用
WHERE e1.salary > e2.salary保留符合要求的员工。- 输出
e1.name AS Employee,无需额外排序。没有符合条件的员工时,查询返回空结果。不同员工可能同名,但每条员工记录都应独立保留,不能因为最终只显示姓名就添加
DISTINCT。
代码实现
-- 同一张表起两个别名,分别扮演「员工」与「经理」两个角色。
SELECT e1.name AS Employee
FROM Employee e1
JOIN Employee e2
-- 员工的经理编号对应经理行的主键。
ON e1.managerId = e2.id
WHERE e1.salary > e2.salary;
复杂度分析
- 时间复杂度:取决于连接计划;逐行按主键索引查经理可按 $O(n\log(n+1))$ 估算,哈希连接或嵌套循环采用不同成本。
- 空间复杂度:取决于连接方式:索引查找的额外工作区较小,哈希连接可能使用 $O(n)$ 空间。
关键点总结
[!green]
- 先固定别名角色,再写关系和比较方向。
- 比较的是直属经理,不是任意薪水较低的人。
- 按员工记录输出,同名员工仍可以各占一行。
易错点总结
[!yellow]
- 用员工 id 匹配另一行的 managerId:角色关系被反转。
- 使用大于等于:薪水持平不符合要求。
- 输出经理姓名:选错结果侧。
- 只比较薪水,不连接经理关系:会把无上下级关系的人配在一起。
相似题目
| 题目 | 难度 | 关联与区别 |
|---|---|---|
| 175. 组合两个表 | 简单 | 同样通过关联键连接记录,本题是员工表自连接,managerId指向同表id。 |
| 184. 部门工资最高的员工 | 中等 | 同样比较员工薪资,原题按部门求最高者,本题只与直接经理比较。 |
转载与许可
许可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!