题解 | 获取每个部门中薪水最高的员工相关信息
获取每个部门中薪水最高的员工相关信息
https://www.nowcoder.com/practice/4a052e3e1df5435880d4353eb18a91c6
SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no WHERE de.emp_no NOT IN ( SELECT A.emp_no FROM (SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no) AS A JOIN (SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no) AS B WHERE A.salary < B.salary AND A.dept_no = B.dept_no ) ORDER BY dept_no ASC
我的这个思路可能有点麻烦,纯属给大家提供一个新的视角
其实,找极值也可以用自我连接
SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no
这就是把员工的编号、部门、工资集合在一起了,把这个表命名为A,然后A表自我连接,然后使用WHERE条件语句查询那些有比同部门的其它员工工资低的的员工,他们肯定不是工资最高的,把这些不符合要求的员工编号集合在一起:
SELECT A.emp_no FROM (SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no) AS A JOIN (SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no) AS B WHERE A.salary < B.salary AND A.dept_no = B.dept_no
最后,再查一次员工的编号、部门、工资集合起来的表,在表中剔除掉上面找到的不符合条件的员工,就可以得到所有符合条件的员工了,最后别忘了排序
SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no WHERE de.emp_no NOT IN ( SELECT A.emp_no FROM (SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no) AS A JOIN (SELECT de.dept_no, de.emp_no, s.salary FROM dept_emp de JOIN salaries s ON de.emp_no = s.emp_no) AS B WHERE A.salary < B.salary AND A.dept_no = B.dept_no ) ORDER BY dept_no ASC