如何编写正确/高效的查询

问题描述 投票:3回答:1

我有一个关于编写查询的正确方法的问题。

我有一个员工表,让我们说有4列employee_iddepartmentsalaryemail

有一些没有电子邮件地址的记录,我想找到使用窗口函数编写SQL查询的最有效方法,它带来每组的工资总和除以所有没有电子邮件地址的工资。

我有2个解决方案,当然只有一个是高效的,任何人都可以给出任何建议吗?

select department, sum(salary) as total
from employees
where email is null
group by 1

选项1

select a.department , a.total/(select sum(salary) from employees where email is null) 
from (
  select department, sum(salary) as total
  from employees
  where email is null
  group by 1
) a

选项2

select a.department , a.total/sum(a.total) over()
from (
  select department, sum(salary) as total
  from employees
  where email is null
  group by 1
) a

我想查询2更有效率,但它是正确的方法吗?将条款留空是否有效?

刚开始使用PostgreSQL而不是MySQL 5.6。

postgresql
1个回答
0
投票

你的第二个问题更好。

第一个查询必须扫描employees两次,而第二个表只扫描子查询的(希望更小)结果集来计算总和。

OVER子句留空是完全有效的,这意味着所有结果行将获得相同的值(这是您想要的)。

© www.soinside.com 2019 - 2024. All rights reserved.