文章目录
  1. 1. 题目
  2. 2. 解题思路
  3. 3. 构造测试数据
  4. 4. 一种答案
  5. 5. 另一种答案

题目

#181 Employees Earning More Than Their Managers

解题思路

这是成功率最高的一题。需要想办法查找出某人对应 Manager 的 Salary,并放在同一个表中,然后比较 Salary 就很方便了。可以利用 INNER JOIN

构造测试数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE IF NOT EXISTS Employee (
Id INT,
Name VARCHAR(50),
Salary INT,
ManagerId INT
);

DELETE FROM Employee;

INSERT INTO Weather VALUES
(1, 'Joe', 70000, 3),
(2, 'Henry', 80000, 4),
(3, 'Sam', 60000, NULL),
(4, 'Max', 90000, NULL);

预期结果:

1
2
3
4
5
+----------+
| Employee |
+----------+
| Joe |
+----------+

一种答案

完整答案

1
2
3
4
5
6
7
8
9
-- Runtime: 1552 ms
SELECT
a.Name
FROM
Employee AS a
INNER JOIN
Employee AS b ON a.ManagerId = b.Id
WHERE
a.Salary > b.Salary

我们来分步看,第一步先把所有需要的列查询出来,使用 INNER JOIN

1
2
3
4
5
6
7
8
9
10
SELECT 
a.Id,
a.Name,
a.Salary,
b.Id AS ManagerId,
b.Salary AS ManagerSalary
FROM
Employee a
INNER JOIN
Employee b ON a.ManagerId = b.Id

其结果是

Id Name Salary ManagerId ManagerSalary
1 Joe 70000 3 60000
2 Henry 80000 4 90000

第二步就简单了,加上 WHERE a.Salary > b.Salary 即可,并删除第一步多余的列。

另一种答案

和上面答案其实一样的,只是不显式写出 INNER JOIN 而是 FROM 中又两个表,效率应该是一致的。个人觉得还是显式写出 INNER JOIN 比较好,语法清晰。

1
2
3
4
5
6
7
8
SELECT 
A.Name
FROM
Employee A,
Employee B
WHERE
A.ManagerId = B.Id
AND A.Salary > B.Salary

本博客微信公众号

文章目录
  1. 1. 题目
  2. 2. 解题思路
  3. 3. 构造测试数据
  4. 4. 一种答案
  5. 5. 另一种答案