UPDATE语句使用聚合函数报错,请求正确写法指导
解决UPDATE语句中使用聚合函数的报错问题
嘿,这个报错的原因很清晰:你在UPDATE的WHERE子句里直接用了MAX(a.row_number)聚合函数,但SQL语法不允许这么操作——聚合函数是用来对一组数据做统计计算的,没法直接放到逐行判断的WHERE筛选逻辑里。
看你的语句,需求应该是更新两类行:一是renew_type为'專案異動'的行,二是每个contr_id分组下row_number最大的行。我们可以先提前算出每个分组的最大row_number,再关联到UPDATE语句中,修改后的正确写法如下:
UPDATE ttemp.TMP_KPIR_F_RT_DETAIL a SET pre_project_code = ( SELECT tt.old_proj_cde FROM ttemp.TMP_KPIR_RT_BASE tt WHERE tt.contr_id = a.contr_id AND tt.row_number = 1 ) WHERE a.renew_type = '專案異動' OR (a.contr_id, a.row_number) IN ( SELECT contr_id, MAX(row_number) FROM ttemp.TMP_KPIR_F_RT_DETAIL GROUP BY contr_id );
简单说下改动的逻辑:
- 新增了一个子查询
(SELECT contr_id, MAX(row_number) FROM ttemp.TMP_KPIR_F_RT_DETAIL GROUP BY contr_id),提前计算出每个contr_id对应的最大row_number值; - 用
(a.contr_id, a.row_number) IN (...)来匹配符合分组最大row_number的行,完美绕开了WHERE子句不能直接用聚合函数的限制; - 原有的获取
old_proj_cde的子查询逻辑保持不变,确保pre_project_code能正确赋值。
另外给个小提示:如果那个获取old_proj_cde的子查询可能返回NULL,你可以用COALESCE函数设置默认值,比如把SET部分改成pre_project_code = COALESCE((SELECT ...), ''),避免字段被意外设为NULL。
内容的提问来源于stack exchange,提问作者Steven Huang
相关产品推荐
相关产品推荐

