题目来源于leetcode:184. 部门工资最高的员工
思路:
首先是分部门的,因此肯定会用到group by ;其次各部门拥有最高工资的员工可能不仅仅只有一个人。
初步解法:
根据需求,可以先查询Employee表中的各部门的最高工资标准,作为一个标准线,代码如下:
select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId -- 各部门最高工资的标准
有了这个工资水平线,就可以用它来和员工工资进行比较,工资等于最高工资的员工使我们需要的结果,代码如下
select d.Name Department,e.Name Employee ,e.Salary from Employee e left join Department d on d.Id=e.DepartmentId left join (select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId)a on a.DepartmentId = e.DepartmentId where e.Salary = a.Salary
写到这我感觉问题不大了,执行的时候输出也和预期结果一致,但是当我提交的时候,结果却仍然是解答错误,仔细看了一下提交记录中的测试用例,看到一个提示,如下
原来当Department表记录为空时,输出与预期不一致。我想这个测试用例可能是出于业务上的场景考虑。
二次考虑:
造成我这种输出的原因是我用的是左连接,即Employee表是主表,其它表不论是否有数据都不会影响记录的行数。既然要考虑Department表的记录数,那我不如就把Department表作为主表来连接,即对Department表进行右连接,而那个最高工资水平线的表本身就是从Employee表中查询的,因此它的记录行数应该小于等于Employee的记录数,总之它的记录数受Employee的影响,因此它采用左连接还是右连接都无关紧要。修改后的代码如下(仅仅一个left join 改成right join)
select d.Name Department,e.Name Employee ,e.Salary from Employee e right join Department d on d.Id=e.DepartmentId left join (select Max(Salary) Salary,DepartmentId from Employee group by Employee.DepartmentId)a on a.DepartmentId = e.DepartmentId where e.Salary = a.Salary
这样就能提交成功了,刚开始也只是凭感觉试了一下没多想,结果成功了反倒让我挺惊讶,仔细一想确实是这么一个事儿。
大家有什么想法,一起来讨论呀!
原文地址:https://www.cnblogs.com/masTerpie/p/11644278.html
时间: 2024-11-05 18:44:13