You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:58:27