You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用子查询更新列?员工与部门表更新SQL语句求助

嘿,我来帮你搞定这个部门员工数更新的问题!

首先咱们先看看你原来的语句为啥没成功:你在子查询里加了group by e.dept_id,这其实是多余的——因为where条件已经把部门ID关联起来了,每个部门只会返回一个统计值。但更关键的是,如果某个部门在EMPLOYEE表里没有对应记录(或者像你这里的部门2,原来DEPARTMENT表里根本没有这个部门),子查询会返回null,而不是你想要的员工数,这就导致更新失败或者结果不对。

下面分不同数据库给你对应的解决方案,既能更新现有部门的counts,还能自动把EMPLOYEE里存在但DEPARTMENT里没有的部门加进去,正好符合你想要的最终结果:

MySQL 解决方案

先确保DEPT_ID是主键或者唯一键,然后用INSERT ... ON DUPLICATE KEY UPDATE一键搞定更新+插入:

INSERT INTO department (dept_id, counts)
SELECT dept_id, COUNT(*) AS counts
FROM employee
GROUP BY dept_id
ON DUPLICATE KEY UPDATE counts = VALUES(counts);

这个语句会先统计每个部门的员工数,然后往DEPARTMENT表里插:如果部门已经存在,就更新counts为最新统计值;如果不存在,直接插入新行。

Oracle/SQL Server 解决方案

用MERGE语句来实现“匹配就更新,不匹配就插入”:

MERGE INTO department d
USING (
    SELECT dept_id, COUNT(*) AS counts
    FROM employee
    GROUP BY dept_id
) e
ON (d.dept_id = e.dept_id)
WHEN MATCHED THEN
    UPDATE SET d.counts = e.counts
WHEN NOT MATCHED THEN
    INSERT (dept_id, counts)
    VALUES (e.dept_id, e.counts);

如果你只是想更新DEPARTMENT里已有的部门,不想加新部门,可以用下面的语句(以MySQL为例,其他数据库把COALESCE换成ISNULL就行):

UPDATE department p
SET p.counts = COALESCE(
    (SELECT COUNT(*) FROM employee e WHERE e.dept_id = p.dept_id),
    0
);

这里用COALESCE把null转换成0,避免counts变成空值。

内容的提问来源于stack exchange,提问作者Neha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:54:23