SQL实现字段求和跨表写入 执行无报错但数据未更新问题排查
问题根因
脚本执行无报错但最终报表数据无变化,核心是两处逻辑错误:
- 两个
UPDATE语句的关联条件缺失匹配字段。你对temptable2做聚合时是按col1、col2两个字段联合分组,但关联temptable1执行更新时,ON子句只写了t2.col1 = t1.col1,没有补充col2的匹配规则。只要同一个col1下存在多个不同col2的分组,数据库要么随机匹配一条分组结果更新,要么因为匹配关系不唯一无法触发正确更新,最终temptable1里存储的还是第一步INSERT写入的max()计算值,看起来和没更新一样。 - 操作逻辑冗余。你先插入
max聚合值、再分两次UPDATE覆盖求和字段的写法没有必要,多步执行不仅效率低,还大幅提升了写错关联逻辑的概率,后续排查问题也更麻烦。
修正方案
所有操作仅读写你生成的目标表temptable1,对存原始数据的temptable2只有读操作,完全满足“保留原始表数据不变”的要求。
优先推荐单步写入的写法,从根源避免关联更新的错误,适合每次执行前temptable1为空的场景:
-- 仅清空自己生成的目标临时表,避免历史脏数据干扰,严禁对temptable2执行清空/修改操作 TRUNCATE TABLE temptable1; -- 一次完成所有聚合计算写入,不需要后续单独执行UPDATE INSERT INTO temptable1 (col1, col2, col3, col4, col5, col6, col7, col8) SELECT col1, col2, MAX(col3), MAX(col4), SUM(col3 + col4) AS col5, -- 直接计算col3+col4的求和结果 MAX(col6), MAX(col7), SUM(col6 + col7) AS col8 -- 直接计算col6+col7的求和结果 FROM temptable2 GROUP BY col1, col2;
如果你必须保留先插入基础数据、再更新求和字段的逻辑,一定要补全两个UPDATE语句的关联条件,用col1+col2两个字段联合匹配,修正后的代码如下:
-- 更新col8字段,补全col2关联条件 UPDATE t1 SET t1.col8 = t2.col8 FROM temptable1 t1 INNER JOIN ( SELECT col1, col2, SUM(col6 + col7) as col8 FROM temptable2 GROUP BY col1, col2 ) as t2 ON t2.col1 = t1.col1 AND t2.col2 = t1.col2; -- 更新col5字段,补全col2关联条件 UPDATE t1 SET t1.col5 = t2.col5 FROM temptable1 t1 INNER JOIN ( SELECT col1, col2, SUM(col3 + col4) as col5 FROM temptable2 GROUP BY col1, col2 ) as t2 ON t2.col1 = t1.col1 AND t2.col2 = t1.col2;
后续执行写入永久表的操作时,仅读取
temptable1的计算结果即可,全程不会修改temptable2的原始业务数据。
内容的提问来源于stack exchange,提问作者Jurrasicore
相关产品推荐
相关产品推荐

