1. 分析表结构
- dept_emp:员工id,部门id
- salaries:员工id,工资
- 涉及字段:dept_emp(emp_no,dept_no), salaries(salary)
2. 解题步骤
2.1 查询每个部门的最高工资
因 dept_emp 表中没有 salary 字段,所以需要与 salaries 表联结, 然后根据部门id分组查询每个部门最高工资
SELECT
    e.dept_no,
    max( s.salary ) AS maxSalary 
FROM
    dept_emp e
    INNER JOIN salaries s ON e.emp_no = s.emp_no 
GROUP BY
    e.dept_no 2.2 查询最高工资的员工信息
将步骤 1 查询的结果作为虚表与 dept_emp 和 salaries 表联结,联结条件为部门ID和最大工资。
为什么要与部门表联结呢?工资表里不是有员工id吗?(这里有个坑,不同部门的员工最大工资可能会重复,所以仅使用工资作为联结条件,可能会返回错误结果)
SELECT
    e.dept_no,
    e.emp_no,
    maxSalary 
FROM
    dept_emp e
    INNER JOIN salaries s ON e.emp_no = s.emp_no
    INNER JOIN (
    SELECT
        e.dept_no,
        max( s.salary ) AS maxSalary 
    FROM
        dept_emp e
        INNER JOIN salaries s ON e.emp_no = s.emp_no 
    GROUP BY
        e.dept_no 
    ) AS m ON e.dept_no = m.dept_no
    AND s.salary = m.maxSalary  2.3 最后按照部门id排序即可
SELECT
    e.dept_no,
    e.emp_no,
    maxSalary 
FROM
    dept_emp e
    INNER JOIN salaries s ON e.emp_no = s.emp_no
    INNER JOIN (
    SELECT
        e.dept_no,
        max( s.salary ) AS maxSalary 
    FROM
        dept_emp e
        INNER JOIN salaries s ON e.emp_no = s.emp_no 
    GROUP BY
        e.dept_no 
    ) AS m ON e.dept_no = m.dept_no 
    AND s.salary = m.maxSalary 
ORDER BY
    e.dept_no 
 京公网安备 11010502036488号
京公网安备 11010502036488号