Leetcode 181. Employees Earning More Than Their Managers

181. Employees Earning More Than Their Managers

原题目链接:181. Employees Earning More Than Their Managers

Employee表中保存所有的员工以及其直接经理的数据。每一名员工有一个Id列,也有一列保存经理的Id。

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+

假设在给定的Employee表当中,写一条SQL查询语句,将那些比他经理收入高的员工找出来。对于上述的表格,Joe是唯一的一位收入比他经理还高的员工。

+----------+
| Employee |
+----------+
| Joe      |
+----------+

Solution

方法一:采用WHERE语句[Accepted]

Algorithm

考虑到这个表格有员工经理的信息,我们可能需要从这里获取信息两次。

1
2
3
SELECT *
FROM Employee AS a, Employee AS b
;

注意:关键字’AS’是可选的。


























































































































































































IdNameSalaryManagerIdIdNameSalaryManagerId
1Joe7000031Joe700003
2Henry8000041Joe700003
3Sam600001Joe700003
4Max900001Joe700003
1Joe7000032Henry800004
2Henry8000042Henry800004
3Sam600002Henry800004
4Max900002Henry800004
1Joe7000033Sam60000
2Henry8000043Sam60000
3Sam600003Sam60000
4Max900003Sam60000
1Joe7000034Max90000
2Henry8000044Max90000
3Sam600004Max90000
4Max900004Max90000
> 前3列来自表a,后3列来自表b。

从两个表格提数可以获得两个表格的笛卡尔积。在这种案例当中,输出会有 4*4 = 16条记录。但是,我们所感兴趣的是员工薪水高于他/她的直接经理的记录。因此,我们需要在一个WHERE语句当中加入两个条件。

相应的SQL代码如下:

1
2
3
4
5
6
7
8
SELECT *
FROM
Employee AS a,
Employee AS b
WHERE
a.ManagerId = b.Id
AND a.Salary > b.Salary
;

考虑我们所需要的仅仅是员工的姓名,因此我们稍微修改一下上述代码得到一个解决方案。

MySQL

1
2
3
4
5
6
SELECT
a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
ON a.ManagerId = b.Id
AND a.Salary > b.Salary
;

方法二:使用JOIN语句[Accepted]

Algorithm

事实上,JOIN是将不同表格链接在一起更常用更高效地方式,并且我们可以通过ON来指定特定的条件。

MySQL

1
2
3
4
5
6
SELECT 
a.NAME AS Employee
FROM Employee AS a JOIN Employee AS b
ON a.ManagerId = b.Id
AND a.Salary > b.Salary
;