解题思路
- 看似复杂,其实这题的解题思路与《查找入职员工时间排名倒数第三的员工所有信息》 类似,都可以使用笛卡尔积去比较。
- 根据 emp_no 内联 dept_emp 表和 salaries 表为 A 表,然后再同样根据 emp_no 内联一次 dept_emp 表和 salaries 表称为 B 表,然后 A 表和 B 表根据部门编号 dept_no 进行笛卡尔积,比较 A 表和 B 表的相同部门内的工资,如果 A 表工资比 B 表工资低,用 COUNT() 函数计数一次,最后计算出来数值为 0 的说明在同一部门内没有人比自己(即 A 表)工资高。(如果为 1 说明自己是第二高,2 说明自己是第三高)
代码实现
SELECT d1.dept_no, d1.emp_no, s1.salary maxSalary
FROM dept_emp d1
LEFT JOIN salaries s1
ON d1.emp_no = s1.emp_no
WHERE (
SELECT count(*)
FROM dept_emp d2
LEFT JOIN salaries s2
ON d2.emp_no = s2.emp_no
WHERE d1.dept_no = d2.dept_no
AND s1.salary < s2.salary
) < 1
ORDER BY d1.dept_no;