在 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 不需要
如果您的数据库版本是 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
我认为您可以使用相关子查询:
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,这似乎是合理的。
我有 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 不需要
如果您的数据库版本是 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
我认为您可以使用相关子查询:
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,这似乎是合理的。