在 3 个不同表之间的 2 个 JOIN 后查找 MAX

Finding MAX after 2 JOINs between 3 different tables

我有 3 个表格 employees, salary 和 dept_emps 以下给定格式:

员工:

emp_no     first_name
---------------------
01         ABC
02         XYZ
03         MNO
04         PQR

工资:

emp_no     salary
-------------------
01          10000
02          20000
03          15000
04         100000

dept_emp:

emp_no     dept_no
------------------
01         d01
02         d02
03         d01
04         d02

所需输出:

该部门薪水最高的员工的

dept_no 和 emp_id

dept_no    emp_id
------------------
d01        03
d02        04

我尝试对子查询使用过滤,但它像无限循环一样卡住了,没有输出:

SELECT first_name, dept_no
FROM employees e 
JOIN salaries s USING (emp_no)
JOIN dept_emp de USING (emp_no)
WHERE s.salary = (SELECT MAX(salary)
                  FROM dept_emp de2
                  JOIN salaries USING (emp_no)
                  WHERE de2.dept_no = de.dept_no);

对此的有效查询是什么?为什么我的查询不起作用?

您需要一个带有聚合的额外嵌套查询来计算每个部门的最高薪水,例如

SELECT ss.dept_no, s.emp_no as emp_id
  FROM salaries s
  JOIN
   (
    SELECT d.dept_no, MAX(s.salary) AS max_salary
      FROM salaries s 
      JOIN dept_emp d USING (emp_no)
     GROUP BY d.dept_no 
   ) ss
    ON s.salary = ss.max_salary

P.S: employees table 不需要

Demo

如果您的数据库版本是 8,则在子查询中使用 DENSE_RANK() 等分析函数:

SELECT dept_no, emp_no AS emp_id
  FROM
  (
    SELECT d.dept_no, s.emp_no, 
           DENSE_RANK() OVER (PARTITION BY d.dept_no ORDER BY s.salary DESC) AS dr
      FROM salaries s 
      JOIN dept_emp d 
        ON d.emp_no = s.emp_no
  ) sd     
 WHERE dr = 1

Demo

我认为您可以使用相关子查询:

select d.*,
       (select e.first_name
        from dept_emp de join
             employees e
             using (emp_no) join
             salaries s
             using (emp_no)
        where de.dept_no = d.dept_no
        order by s.salary desc
        limit 1
       ) as first_name
from departments d;

这假设您与部门有 table,这似乎是合理的。