PostgreSQL执行UPDATE时子查询返回多行错误如何解决?
报错原因
你编写的UPDATE语句中的子查询通过GROUP BY id_local会为每一个不同的id_local返回一行拼接结果,整体输出行数和唯一id_local的数量一致。但UPDATE语句的字段赋值逻辑要求子查询针对当前待更新的行只能返回单个值,系统无法判断多行结果中应该取哪一行赋值,因此触发more than one row returned by a subquery used as an expression报错。
正确实现方式
场景1:直接更新原表
如果你的需求是将原表中同一id_local对应的所有行的id_epigrafe都统一更新为该id对应的拼接值,需要在子查询中增加和外层更新行的关联条件,确保子查询每次仅返回对应id的单个拼接结果,代码如下:
UPDATE febrero20_2 t1 SET id_epigrafe = ( SELECT string_agg(t2.id_epigrafe, ', ') FROM febrero20_2 t2 WHERE t2.id_local = t1.id_local GROUP BY t2.id_local );
注意:执行完成后原表同一id_local下的所有行的id_epigrafe值会完全相同,仍会保留重复的id行,存在数据冗余。如果需要拼接时自动去重,可以将string_agg的写法修改为string_agg(DISTINCT t2.id_epigrafe, ', ')。
场景2:每个ID仅保留一行数据
你之前使用的CREATE TABLE新建表的方案本身更合理,最终生成的febrero20_3表中每个id_local仅对应一行,epigrafe_list存储拼接后的结果,没有冗余数据。如果需要保留原表名,可以在新建表完成后执行重命名操作:
-- 备份原表 ALTER TABLE febrero20_2 RENAME TO febrero20_2_bak; -- 将新表重命名为原表名 ALTER TABLE febrero20_3 RENAME TO febrero20_2;
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

