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 | SELECT * |
注意:关键字’AS’是可选的。
| Id | Name | Salary | ManagerId | Id | Name | Salary | ManagerId |
|---|---|---|---|---|---|---|---|
| 1 | Joe | 70000 | 3 | 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 | 1 | Joe | 70000 | 3 |
| 3 | Sam | 60000 | 1 | Joe | 70000 | 3 | |
| 4 | Max | 90000 | 1 | Joe | 70000 | 3 | |
| 1 | Joe | 70000 | 3 | 2 | Henry | 80000 | 4 |
| 2 | Henry | 80000 | 4 | 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | 2 | Henry | 80000 | 4 | |
| 4 | Max | 90000 | 2 | Henry | 80000 | 4 | |
| 1 | Joe | 70000 | 3 | 3 | Sam | 60000 | |
| 2 | Henry | 80000 | 4 | 3 | Sam | 60000 | |
| 3 | Sam | 60000 | 3 | Sam | 60000 | ||
| 4 | Max | 90000 | 3 | Sam | 60000 | ||
| 1 | Joe | 70000 | 3 | 4 | Max | 90000 | |
| 2 | Henry | 80000 | 4 | 4 | Max | 90000 | |
| 3 | Sam | 60000 | 4 | Max | 90000 | ||
| 4 | Max | 90000 | 4 | Max | 90000 | ||
| > 前3列来自表a,后3列来自表b。 |
从两个表格提数可以获得两个表格的笛卡尔积。在这种案例当中,输出会有 4*4 = 16条记录。但是,我们所感兴趣的是员工薪水高于他/她的直接经理的记录。因此,我们需要在一个WHERE语句当中加入两个条件。
相应的SQL代码如下:
1 | SELECT * |
考虑我们所需要的仅仅是员工的姓名,因此我们稍微修改一下上述代码得到一个解决方案。
MySQL
1 | SELECT |
方法二:使用JOIN语句[Accepted]
Algorithm
事实上,JOIN是将不同表格链接在一起更常用更高效地方式,并且我们可以通过ON来指定特定的条件。
MySQL
1 | SELECT |