我在计算员工数量时编写SQL查询时遇到问题。
这是一个问题:有2个表,
T1
,属性为E_ID(primary key), E_Name, DpartmentID;
T2
,DepartmentID(primary key), DepartmentName
如果我想写下技术部门的员工人数,我应该如何计算?
SELECT COUNT(E_T1.ID)
FROM T1 JOIN T2 ON T1.DepartmentID = T2.DepartmentID
WHERE T2.DepartmentName = 'Technology'
在接受采访时我被问到这个问题,但是受访者说我错过了什么......有人可以帮我吗?谢谢!
答案 0 :(得分:0)
您的查询做出了一些假设:
我会将该查询写为
select dept.DepartmentId as department_id ,
sum(case when emp.E_ID is not null then 1 else 0 end) as employee_count ,
from T2 dept
left join T1 emp on emp.DepartmentId = dept.DepartmentId
where dept.DepartmentName = 'Technology'
group by t2.DepartmentId
您会注意到我已经反转了加入顺序,以强调您正在制作有关该部门的摘要信息这一事实。
我们从department表到employee表进行左[外]连接。这保证了每个部门至少有一行,即使没有分配给员工。
然后我们使用带有*判别函数的sum()
来计算计数。
您可以采取的另一种方法可能是
你应该试试
select dept.DepartmentId as department_id ,
( select count(*)
from T1 emp
where emp.DepartmentId = dept.DepartmentId
) as employee_count
from T2 dept
where dept.DepartmentName = 'Technology'
group by dept.DepartmentId
这是否比我的第一个解决方案获得更好的执行计划取决于数据库中的各种因素。告诉的唯一方法是根据类似生产的数据检查执行计划。
这个查询更简单,比我的第一个解决方案更优雅(或更少)是主观的。这个解决方案确实包含一个相关的子查询,[理论上]意味着子查询必须为外部结果集中的每一行执行一次 - 大概是1,所以应该从执行计划的角度来看。当然,任何体面的查询优化器都能够将它重构成一个连接...但我离题了。