如何在pgAdmin中将分组统计结果写入PostgreSQL表列?
解决PostgreSQL UPDATE子查询返回多行的错误
你的错误原因是UPDATE语句中的子查询未正确关联外部表:子查询里的WHERE customer_id=customer_id是将子查询内部的summary表字段与自身比较,并非关联正在更新的外部行,导致子查询返回所有分组的统计结果(多行),而SET赋值需要单行结果,因此触发more than one row returned错误。
以下是三种可行的解决方法:
方法一:关联子查询(明确指定表别名)
通过给外部表和子查询表设置不同别名,让子查询仅返回当前更新行对应customer_id的统计值:
UPDATE summary s1 SET sum_of_rentals = ( SELECT count(*) FROM summary s2 WHERE s2.customer_id = s1.customer_id )
方法二:预统计后关联更新(高效大表场景)
先预先统计所有customer_id的计数结果,再通过FROM子句关联原表进行更新,适合数据量较大的场景:
UPDATE summary s SET sum_of_rentals = agg.count_rentals FROM ( SELECT customer_id, count(*) AS count_rentals FROM summary GROUP BY customer_id ) agg WHERE s.customer_id = agg.customer_id;
方法三:窗口函数更新(单次扫描实现)
利用窗口函数PARTITION BY直接计算每个customer_id的行数,再关联更新:
UPDATE summary SET sum_of_rentals = cnt FROM ( SELECT customer_id, count(*) OVER (PARTITION BY customer_id) AS cnt FROM summary ) sub WHERE summary.customer_id = sub.customer_id;
内容的提问来源于stack exchange,提问作者J.Chambers
相关产品推荐
相关产品推荐

