题目描述

✅ 181. 超过经理收入的员工

image-20260929090839894

image-20260929090839997

题意分析

Employee 中每行记录一名员工,managerId 指向其直属经理在同一张表中的 id。找出薪水严格高于直属经理的员工,输出这些员工的姓名,列名为 Employee,结果顺序不限。

解法:员工与经理自连接

核心思路

[!blue]
用自连接把员工和对应经理放到同一行。 将员工表引用两次,别名 e1 表示待检查的员工,e2 表示经理。连接条件应为 e1.managerId=e2.id,这样取得的才是这名员工的直属经理,而非任意其他员工。

id 是主键,一名员工至多匹配一条经理记录。连接后用 e1.salary>e2.salary 筛选,恰好对应“员工比自己的经理收入高”;最后选择 e1.name,输出的身份仍是员工这一侧。

内连接只保留经理匹配成功的行。managerId 为 NULL 时无法通过等值连接,不会参与薪资比较,也不需要额外添加排除空经理的条件。相同薪水不满足严格大于,直接被过滤掉。

解题步骤

  1. 用 e1、e2 两个别名引用 Employee。
  2. 按员工的 managerId 匹配经理的 id。
  3. 用 WHERE e1.salary > e2.salary 保留符合要求的员工。
  4. 输出 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. 部门工资最高的员工 中等 同样比较员工薪资,原题按部门求最高者,本题只与直接经理比较。
转载与许可
作者
链接 https://hgnulb.github.io/blog/2022/53048755
许可 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!