首页 > 解决方案 > INNER JOIN 和计数 POSTGRESQL

问题描述

我正在学习 postgresql 和 Inner join 我有下表。员工

Id Name    DepartmentId
1  John S.    1
2  Smith P.   1
3  Anil K.    2

部门

Department
Id Name
1  HR
2  Admin

我想查询返回每个部门的部门名称和员工人数。

SELECT Department.name , COUNT(Employee.id) FROM Department INNER JOIN Employee ON Department.Id = Employee.DepartmentId Group BY Employee.department_id;

我不知道我做错了什么,因为我是数据库查询的新手。

标签: sqlpostgresql

解决方案


当涉及“多”表的所有行或主要部分时,通常先聚合然后再加入会更快。这里肯定是这样,因为我们在计算“每个部门”,根本没有WHERE条款。

SELECT d.name, COALESCE(e.ct, 0) AS nr_employees
FROM   Department d
LEFT   JOIN (
   SELECT DepartmentId AS id, count(*) AS ct
   FROM   Employee
   GROUP  BY DepartmentId
   ) e USING (id);

还做了一个LEFT [OUTER] JOIN,以保持部门没有任何员工的结果。并COALESCE报告0员工而不是NULL在那种情况下。

相关,有更多解释:

GROUP BY在修复子句后,您的原始查询也可以工作:

SELECT Department.name, COUNT(Employee.id)
FROM   Department
INNER  JOIN Employee ON Department.Id = Employee.DepartmentId
Group  BY Department.Id;  --!

假设Department.IdPRIMARY KEY表的,在这种情况下,它涵盖了该表的所有列,包括Department.name. 你可能想要LEFT JOIN像上面那样。

旁白:在 Postgres 中考虑合法的小写名称。看:


推荐阅读