PostgreSQL如何基于employee表的count统计更新department表的dcount列
错误原因
你原来的写法中,子查询没有和外层更新的department表做行关联,直接分组后返回了所有部门的员工计数结果(多行),单个字段赋值不能接收多行结果,因此触发报错。
修正方案
方案1:关联子查询写法(兼容所有主流SQL数据库)
这种写法逻辑简单,适合小数据量场景:
UPDATE department SET dcount = ( SELECT COUNT(*) FROM employee WHERE employee.dno = department.dnumber );
如果需要把没有员工的部门的dcount设置为0而非NULL,可以加COALESCE处理:
UPDATE department SET dcount = COALESCE( (SELECT COUNT(*) FROM employee WHERE employee.dno = department.dnumber), 0 );
方案2:关联更新写法(适合MySQL/PostgreSQL等支持关联更新的数据库,大数据量下效率更高)
先提前分组统计好每个部门的员工数,再批量关联更新:
UPDATE department d LEFT JOIN ( SELECT dno, COUNT(*) AS emp_count FROM employee GROUP BY dno ) e ON d.dnumber = e.dno SET d.dcount = COALESCE(e.emp_count, 0);
更新完成后执行以下语句即可验证结果是否符合预期:
SELECT dname, dnumber, dcount FROM department ORDER BY dnumber;
内容的提问来源于stack exchange,提问作者Sai Gruheeth
相关产品推荐
相关产品推荐

