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
相关产品推荐
相关产品推荐

