如何将SUM()计算结果更新到原表?附关联表场景需求
更新表B的val3字段为表A的聚合计算结果
没问题,这个需求核心就是把表A中匹配表B id的记录做聚合计算,再把结果更新到表B的val3字段。下面是几种主流数据库的实现方案:
通用思路
先从表A中计算出每个匹配表B id的val2对应的SUM(value)*1.5,再通过关联表B的id和表A的val2,把计算结果赋值给表B的val3。
MySQL 实现
UPDATE B JOIN ( -- 先聚合表A中符合条件的记录,得到每个val2对应的计算值 SELECT val2 AS b_id, SUM(value)*1.5 AS calc_val FROM A WHERE val2 IN (SELECT id FROM B) -- 只计算表B中存在的id对应的记录 GROUP BY val2 ) AS agg ON B.id = agg.b_id SET B.val3 = agg.calc_val;
PostgreSQL 实现
PostgreSQL 使用FROM子句来关联更新:
UPDATE B SET val3 = agg.calc_val FROM ( SELECT val2 AS b_id, SUM(value)*1.5 AS calc_val FROM A WHERE val2 IN (SELECT id FROM B) GROUP BY val2 ) AS agg WHERE B.id = agg.b_id;
SQL Server 实现
SQL Server 支持JOIN语法的更新写法:
UPDATE B SET val3 = agg.calc_val FROM B JOIN ( SELECT val2 AS b_id, SUM(value)*1.5 AS calc_val FROM A WHERE val2 IN (SELECT id FROM B) GROUP BY val2 ) AS agg ON B.id = agg.b_id;
补充说明
- 如果表B中存在某些
id在表A的val2中没有匹配记录,这些行的val3不会被更新(保持原有值或NULL)。如果需要将这类行的val3设为0,可以用COALESCE函数,比如修改SET子句为SET val3 = COALESCE(agg.calc_val, 0)。 - 你提供的示例中,表B id=1的
val3从50变为770,看起来像是原有值加上计算结果(可能是示例笔误),如果需求是累加而非覆盖,只需要把SET子句改成SET val3 = B.val2 + agg.calc_val即可。
内容的提问来源于stack exchange,提问作者puss
相关产品推荐
相关产品推荐

