T-SQL UPDATE语句累加结果不符问题排查
多表UPDATE累加失败的原因及解决办法
嘿,我来帮你搞明白为啥更新结果和预期不一样!
问题出在哪?
你看你的SELECT查询返回了两条记录:a.ID=1分别匹配了b表中Total为250和500的两行。但当你用UPDATE语句关联这两个表时,大多数数据库(比如MySQL、SQL Server)不会对a表的同一行做多次累加更新——简单说,数据库只会用其中一次匹配到的Total值来更新,而不是把两个值加起来。
比如你的情况,数据库可能只取了第一条匹配的250来计算,1000+250=1250,这就是你看到的实际结果;如果它取第二条的500,结果就是1500,但不管怎样都不会是1750,因为它没把两个值累加起来。
怎么解决?
要实现把所有匹配的Total值都累加,得先把b表中符合条件的Total先求和,再和a表关联更新。给你两个靠谱的方案:
方案一:子查询先聚合总和
先通过子查询算出b表中对应记录的Total总和,再和a表关联更新:
UPDATE a INNER JOIN ( SELECT IID, SUM(Total) AS TotalSum FROM b WHERE ID=19 AND IsActive=1 GROUP BY IID ) AS b_agg ON b_agg.IID = a.ID SET a.Wallet = a.Wallet + b_agg.TotalSum;
方案二:用关联子查询直接更新
如果确定只更新a表中特定的行,也可以直接在UPDATE里嵌套求和子查询:
UPDATE a SET Wallet = Wallet + ( SELECT SUM(Total) FROM b WHERE IID=a.ID AND ID=19 AND IsActive=1 ) WHERE EXISTS ( SELECT 1 FROM b WHERE IID=a.ID AND ID=19 AND IsActive=1 );
这两种方法都能确保把所有匹配的Total值加起来,让a.Wallet从1000变成1750,符合你的预期~
内容的提问来源于stack exchange,提问作者Zibian Domichi
相关产品推荐
相关产品推荐

