题解 | 获取每个部门中薪水最高的员工相关信息

获取每个部门中薪水最高的员工相关信息

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

全部评论

相关推荐

点赞 评论 收藏
分享
吴offer选手:幽默小厂
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务