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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:22:46