题目:
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 |
+----------+
SQL架构:
Create table If Not Exists Employee (Id int, Name varchar(255), Salary int, ManagerId int);
Truncate table Employee;
insert into Employee (Id, Name, Salary, ManagerId) values ('1', 'Joe', '70000', '3');
insert into Employee (Id, Name, Salary, ManagerId) values ('2', 'Henry', '80000', '4');
insert into Employee (Id, Name, Salary, ManagerId) values ('3', 'Sam', '60000', Null);
insert into Employee (Id, Name, Salary, ManagerId) values ('4', 'Max', '90000', Null);
解题语句:
方法:多表查询
SELECT
e.Name AS Employee
FROM
Employee AS e
LEFT JOIN ( SELECT * FROM Employee GROUP BY Id ) AS m ON e.ManagerId = m.Id
WHERE
e.Salary > m.Salary;
- 注:对 id 去重,排除重复数据,减少连接的数据源,提高效率
也可以进一步写为:
SELECT
e.Name AS Employee
FROM
( SELECT * FROM Employee WHERE ManagerId IS NOT NULL ) AS e
LEFT JOIN ( SELECT * FROM Employee GROUP BY Id ) AS m ON e.ManagerId = m.Id
WHERE
e.Salary > m.Salary;
- 注:使用LEFT JOIN时,如果有多个条件,要注意ON和WHERE的使用区别,会影响多表查询结果。查看具体分析

这是一篇关于如何使用SQL解决LeetCode 181题目的文章。内容涉及如何从Employee表中通过多表查询找出收入高于其经理的员工,强调了在使用LEFT JOIN时ON和WHERE子句的区别,以及优化查询效率的方法。
474

被折叠的 条评论
为什么被折叠?



