PostgreSQL:将两列乘积写入新列的UPDATE语句执行卡死求助
问题排查与解决方法
问题原因
你编写的UPDATE语句没有关联主表test2和子查询total的匹配条件,导致数据库执行时产生笛卡尔积:主表的每一行都会和子查询返回的所有行进行匹配,当表中数据量较大时,需要处理的计算量呈指数级增长,直接导致查询长时间无法完成。
解决方法
最简写法(推荐)
不需要使用子查询,直接在SET子句中计算同一行的两列乘积即可:
UPDATE test2 SET jahresbeitrag = beitrag_netto * wert;
带关联条件的子查询写法(若需保留子查询逻辑)
如果必须通过子查询实现,一定要添加主表与子查询的关联条件(比如使用表的主键或唯一标识列,假设表主键为id):
UPDATE test2 t SET jahresbeitrag = total.new FROM (SELECT id, beitrag_netto * wert AS new FROM test2) AS total WHERE t.id = total.id;
验证效果
执行正确语句后,jahresbeitrag列会被正确赋值为对应行beitrag_netto与wert的乘积,和你预期的结果一致:
| beitrag_netto | wert | jahresbeitrag |
|---|---|---|
| 54.3 | 2 | 108.6 |
内容的提问来源于stack exchange,提问作者Anthony Admin
相关产品推荐
相关产品推荐

