如何编写适当/有效的查询

时间:2019-04-10 11:33:11

标签: postgresql

我对编写查询的正确方法有疑问。

我有一个employees表,可以说有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更有效,但这是正确的方法吗?并将over子句留空是否有效?

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

1 个答案:

答案 0 :(得分:0)

您的第二个查询更好。

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

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