今天要解的是184题:部门最高工资的员工。(昨晚网速太不稳定,Leetcode半天打不开。。。导致延迟了😅

题目链接在这里:👉 184. Department Highest Salary

首先看这题要考察的知识点:👉是多表关联查询中JOIN 和 IN 的使用
(但是看好些文章说不建议使用JOIN关联查询当数据量很大的时候?有大佬出来讲解一下吗?谢谢✍)

再看这题的思路: 要找的是部门最高员工,那么思路如下👇:
先关联两表再设置查询条件:通过分组找到各自“部门”最高工资员工。

下面看参考解法,解法一:

SELECT D.Name AS Department, E.Name AS Employee, Salary
FROM Employee E JOIN Department D ON E.DepartmentId = D.Id
WHERE (E.DepartmentId , Salary) IN (SELECT DepartmentId, MAX(Salary) FROM Employee GROUP BY DepartmentId);

因为这个题的数据量很小,所以用JOIN是OK的。然后因为D(Department)是小表,所以用小表驱动大表,后面查询使用IN来解决。

再来看解法二:

SELECT D.Name AS Department, E.Name AS Employee, E.Salary AS Salary
FROM Department D, Employee E 
WHERE E.DepartmentId=D.Id 
AND E.Salary=(SELECT MAX(Salary) FROM Employee E2 WHERE E2.DepartmentId=D.Id);

这个解法就是使用WHERE条件查询,然后用AND 嵌套子查询来找到各自的最高工资,这里要注意一下:嵌套子查询里面要把Employee生成新的表E2才会有效!

然后比较这两种解法,发现第一种的查询速度更快,所以是更优解

当然此题还有其他解法,比如用窗口函数但是掌柜发现在本地MySQL运行是可行的,但是在Leetcode上面就不行,暂时没找到怎么回事,有知道的朋友可以告知一下,谢谢😃。

----------------------------------------------------2020.05.18更新--------------------------------------------
今天发现Leetcode 可以用窗口函数 了😂,可能是之前没有更新MySQL版本吧。