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

如何基于SELECT聚合结果更新Oracle表中不一致的记录?

问题:将tableB的求和结果同步到tableA的count字段

表结构

tableA
    id (唯一)
    count

tableB
    id (不唯一)
    count

需求

对tableB中相同id的count字段求和,找出求和结果与tableA中同id的count值不一致的记录,并将tableA的count更新为该求和结果。

示例数据

tableA
    row1
        id1
        count=10 
    row2
        id2
        count=5 
    row3
        id3
        count=1 

tableB
    row1
        id1
        count=5
    row2
        id1
        count=5 
    row3
        id2
        count=1 
    row4
        id2
        count=3

示例中,id2在tableB的求和结果为4,与tableA中的5不一致,因此需要将tableA中id2的count更新为4。

已实现的差异查询

已写出查询存在差异的id及对应数值的SQL:

select g.id, c.count_sum, g.count
FROM
 tableA g,
 (SELECT
    id,
    SUM(count) count_sum
  FROM tableB
  GROUP BY id) c
where g.id = c.id and 
      c.count_sum <> g.count
      and g.extra_condition = 'dummy'

请问如何将tableB的求和结果更新到tableA的count字段中?


解决方案

通用更新SQL(适配MySQL等数据库)

UPDATE tableA g
JOIN (
    SELECT id, SUM(count) count_sum
    FROM tableB
    GROUP BY id
) c ON g.id = c.id
SET g.count = c.count_sum
WHERE c.count_sum <> g.count
  AND g.extra_condition = 'dummy';

PostgreSQL适配写法

如果使用PostgreSQL,语法略有不同:

UPDATE tableA g
SET count = c.count_sum
FROM (
    SELECT id, SUM(count) count_sum
    FROM tableB
    GROUP BY id
) c
WHERE g.id = c.id
  AND c.count_sum <> g.count
  AND g.extra_condition = 'dummy';

逻辑说明

  1. 子查询c先计算tableB中每个id的count总和
  2. 将tableA与子查询通过id关联
  3. 仅更新总和与tableA原count值不一致且满足extra_condition的记录,直接覆盖tableA的count为计算出的总和

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:18:11