码迷,mamicode.com
首页 > 数据库 > 详细

SQL练习——查询部门工资最高的员工

时间:2019-10-09 21:15:11      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:ems   思路   idt   标准   记录   inf   where   https   href   

题目来源于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

这样就能提交成功了,刚开始也只是凭感觉试了一下没多想,结果成功了反倒让我挺惊讶,仔细一想确实是这么一个事儿。

大家有什么想法,一起来讨论呀!

 

SQL练习——查询部门工资最高的员工

标签:ems   思路   idt   标准   记录   inf   where   https   href   

原文地址:https://www.cnblogs.com/masTerpie/p/11644278.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!