如何基于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';
逻辑说明
- 子查询
c先计算tableB中每个id的count总和 - 将tableA与子查询通过
id关联 - 仅更新总和与tableA原count值不一致且满足
extra_condition的记录,直接覆盖tableA的count为计算出的总和
内容的提问来源于stack exchange,提问作者olaf
相关产品推荐
相关产品推荐

