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

MySQL无需预创建临时表,通过连接或子查询更新表字段的方法

无需临时表的更新方案

当然有更简洁的实现方式!你完全不需要创建临时表,直接把聚合逻辑嵌入到UPDATE语句中即可,甚至可以一次性完成两个字段的更新,减少数据库的扫描次数,提升效率。

方式1:分开更新每个字段(关联子查询)

如果习惯分开操作,可以用关联子查询分别更新empcnt和hrstotal:

更新员工数字段:

UPDATE Proj
SET empcnt = (
    SELECT COUNT(*)
    FROM Pworks
    WHERE Pworks.projno = Proj.projno
)
-- 可选:仅更新在Pworks中有记录的项目,避免无记录项目被设为NULL
WHERE EXISTS (
    SELECT 1
    FROM Pworks
    WHERE Pworks.projno = Proj.projno
);

更新总工时字段:

UPDATE Proj
SET hrstotal = (
    SELECT SUM(hours)
    FROM Pworks
    WHERE Pworks.projno = Proj.projno
)
WHERE EXISTS (
    SELECT 1
    FROM Pworks
    WHERE Pworks.projno = Proj.projno
);

方式2:一次性更新两个字段(更高效)

推荐这种方式,只需要扫描一次Pworks表,一次性计算出两个聚合值,再关联更新Proj表:

UPDATE Proj
INNER JOIN (
    SELECT 
        projno,
        COUNT(*) AS ct,
        SUM(hours) AS h
    FROM Pworks
    GROUP BY projno
) AS project_agg ON Proj.projno = project_agg.projno
SET 
    Proj.empcnt = project_agg.ct,
    Proj.hrstotal = project_agg.h;

补充说明

  • 第二种方式的性能更好,因为它只对Pworks做一次分组聚合,而第一种方式需要扫描两次表。
  • 如果你的Proj表中存在没有对应Pworks记录的项目,第一种方式中的WHERE EXISTS可以避免这些项目的字段被设置为NULL;如果希望这些项目的字段设为NULL,可以去掉WHERE EXISTS条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:30:37