Department 表包含公司所有部门的信息。
基本思路:
1)首先在employee表中查询出各部门的最高工资,得到tmp表,它包含部门id和最高工资
2)连立employee表与tmp表,查询出工资在所在部门最高的员工姓名、部门id和最高工资,得到tmp2表。
3)连接department表与 tmp2表,查询出部门id对应的部门名称
第二步是问题的关键,这里的过滤条件是:
1)员工要属于对应部门,所以连接条件是部门id相等;
2)员工的工资在对应的部门中是最高的,所以查询条件是e.salary = t.max_salary
完整的sql语句如下:
select d.name as Department,j.name as Employee ,max_salary as Salary from department d join (select e.name,t.did,t.max_salary from #tmp2表 employee e join (select departmentid as did,max(salary) as max_salary from employee group by departmentid) t #tmp1表 on e.departmentid = t.did where e.salary = t.max_salary ) j on d.id = j.did;
部门工资前三高的所有员工
employee表与department表的结构和上例是一样的。
编写一个 SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回:
完整的sql语句如下:
select d.name as Department,t.name as Employee,t.Salary as Salary from department d join (select name,salary,departmentid from employee e1 where 3 > #“人数”不超过3,这里用了count(distinct(salary)),从而保证了所有相同工资的员工只会占用一个排名 (select count(distinct(salary)) from employee e2 where e1.departmentid = e2.departmentid #处于同一个部门 and e1.salary < e2.salary)) #工资少于目标员工 on d.id = t.departmentid order by Department,Salary desc;
总结:这两个问题具有共同的特征。第一个问题用的是一种特解,第二个问题用的是通用的方法,但是执行效率比较低。可以把查询条件>3改为>1,就可以查询出各部门工资最高的员工,改为>N 就可以查询出各部门工资前N高的员工。
原文:https://www.cnblogs.com/chxyshaodiao/p/12625796.html