我试着去理解为什么人们普遍认为避免一群人在一起总是有益的。我的问题是:从department_id是外键的雇员表中,找出员工最高工资为40000的部门。
[1]小组采用的方法:
select d.department_name , e.max_salary
from department d
join ( select department_id, max(salary) as max_salary
from emp
group by 1
having max_salary = 40000 ) e
on (d.department_id = e.department_id)2现在采用左联接方法:
select d.department_name, inner_q.salary
from department d
join
(select e.department_id , e.salary
from emp e
left join emp e_inner
on (e.department_id = e_inner.department_id and e.salary < e_inner.salary)
where e_inner.department_id is null and e.salary = 40000 ) inner_q
on (d.department_id = inner_q.department_id)不幸的是,解释计划对我来说没有多大意义。任何帮助,解释谁应该表现得更好,为什么会非常感谢。
发布于 2017-04-19 14:10:40
你工作太辛苦了。
SELECT department_name, MAX(salary) AS max_salary
FROM emp
GROUP BY department_name
HAVING max_salary >= 40000这将比任何带有子查询的版本都要快。
这将使它运行得更快:INDEX(department_name, salary)
(也许你想要的是>= 40000,而不是= 40000?)
此版本将对整个表(或INDEX,如果添加“覆盖”索引)进行一次传递,为每个部门收集最高工资。然后,它将丢弃失败HAVING子句的结果;交付其余的结果。
对于在10K行的表上运行这个GROUP BY,我不会感到不安。一个百万行的表将花费一个值得注意的,但很小的时间。
https://stackoverflow.com/questions/43496095
复制相似问题