1. 分析表结构

  1. dept_emp:员工id,部门id
  2. salaries:员工id,工资
  3. 涉及字段: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