PostgreSQL循环选择更新问题:按各项目最早日期去重更新表排查不出错误
问题诊断与修复方案
错误原因
- 你的SELECT查询中,
MIN(orcitem_dtime_inclusao)聚合后的字段未设置别名,导致循环中调用temprow.orcitem_dtime_inclusao时无法匹配到对应字段,触发字段不存在的报错。 - 逐行循环的写法在数据量级较大时性能表现极差,完全可以用单句关联UPDATE实现需求,效率提升显著。
修复方案
方案1:修正原有循环逻辑
仅需要给聚合字段增加和引用名一致的别名即可:
FOR temprow IN SELECT MIN(orcitem_dtime_inclusao) AS orcitem_dtime_inclusao, orcitem_orc_id FROM orcamento_itens GROUP BY orcitem_orc_id ORDER BY orcitem_orc_id ASC LOOP UPDATE orcamentos SET orc_dtime_orcamento = temprow.orcitem_dtime_inclusao WHERE orc_id = temprow.orcitem_orc_id; END LOOP;
方案2:更高效的单句批量更新(推荐)
不需要遍历循环,直接通过关联子查询批量更新,执行效率远高于循环写法,适配所有数据量级场景:
UPDATE orcamentos o SET orc_dtime_orcamento = oi.min_dtime FROM ( SELECT MIN(orcitem_dtime_inclusao) AS min_dtime, orcitem_orc_id FROM orcamento_itens GROUP BY orcitem_orc_id ) oi WHERE o.orc_id = oi.orcitem_orc_id;
内容的提问来源于stack exchange,提问作者Ezequiel Tavares
相关产品推荐
相关产品推荐

