我目前有两个版本的SQL查询,我正在尝试了解哪一个在性能和成本等方面可能更好。
这是wrt这个问题:Average Salary: Departments VS Company
select department_salary.pay_month, department_id,
case
when department_avg>company_avg then 'higher'
when department_avg<company_avg then 'lower'
else 'same'
end as comparison
from
(
select department_id,
avg(amount) as department_avg,
date_format(pay_date, '%Y-%m') as pay_month
from salary
join employee on salary.employee_id = employee.employee_id
group by department_id, pay_month
) as department_salary
join
(
select avg(amount) as company_avg,
date_format(pay_date, '%Y-%m') as pay_month
from salary
group by date_format(pay_date, '%Y-%m')
) as company_salary
on department_salary.pay_month = company_salary.pay_month
;我的问题是,他们可以在case语句本身中使用第二个表,而不是连接。
select a.pay_month,
a.department_id,
(case when avg(a.salary) > (
select avg(e.salary)
from employee e
where e.pay_month = a.pay_month)
then 'higher'
else 'lower' end) as comparison
from employee a
group by a.pay_month,a.department_id;哪种更好些呢?join真的有必要吗?
发布于 2018-10-16 09:08:01
要确定哪个“更好”,您应该测试性能。有时,使用相关子查询的性能比使用显式join查询的性能要好得多。
当你问:“加入真的有必要吗?”我想你的意思是“join真的有必要吗”。显然,有时可以在没有显式join的情况下表达查询。不过,在幕后,数据库正在实现连接算法(可能是嵌套循环或索引查找)来完成这项工作。
这基本上回答了这个问题。SQL通常提供多种方法来实现相同的目标。因此,您通常可以使用join或不使用join来表达逻辑。需要注意的是:相关子查询实际上等同于left join而不是inner join。
https://stackoverflow.com/questions/52825833
复制相似问题