UPDATE语句SET子句用SUM报错:聚合函数不能出现在更新语句的设置列表中
报错原因
- UPDATE语句的SET子句不支持直接使用SUM、COUNT等聚合函数。聚合函数需要先对数据集做分组计算才能得到结果,直接写在SET赋值位置时,数据库无法确定聚合的分组规则,也无法将聚合结果和待更新的每一行做对应,因此触发报错。
- 你当前的写法没有提前对wtDocAchL表按关联键idDocAch分组计算PAHT的总和,直接将
SUM(wtDocAchL.PAHT)放在SET右侧,不符合SQL语法规范。
解决方法
方案1:预聚合后关联更新(全数据库通用,性能最优)
先通过子查询对wtDocAchL表按idDocAch分组求和,再用聚合后的结果集关联临时表完成更新,代码示例:
UPDATE #tmpDocAcq SET #tmpDocAcq.PVOptionals = t.sum_paht FROM #tmpDocAcq INNER JOIN ( -- 先按关联键分组计算每个id对应的PAHT总和 SELECT idDocAch, SUM(PAHT) AS sum_paht FROM wtDocAchL WHERE wtDocAchL.idNatCost = '2' GROUP BY idDocAch ) t ON #tmpDocAcq.idDocAch = t.idDocAch
方案2:关联子查询赋值(适合简单场景)
如果只有单个关联键,也可以直接在SET的赋值位置写关联子查询实现逐行计算:
UPDATE #tmpDocAcq SET PVOptionals = ( SELECT SUM(PAHT) FROM wtDocAchL WHERE wtDocAchL.idDocAch = #tmpDocAcq.idDocAch AND wtDocAchL.idNatCost = '2' ) -- 可选:添加该条件可以只更新有匹配记录的行,避免无匹配时被赋值为NULL WHERE EXISTS ( SELECT 1 FROM wtDocAchL WHERE wtDocAchL.idDocAch = #tmpDocAcq.idDocAch AND wtDocAchL.idNatCost = '2' )
内容的提问来源于stack exchange,提问作者Noyzware
相关产品推荐
相关产品推荐

