PostgreSQL UPDATE - 左连接查询问题

9
UPDATE user
SET balance = balance + p.amount 
FROM payments p WHERE user.id = p.user_id AND p.id IN (36,38,40)

但它仅在首次付款中增加余额的价值金额为1936。请告诉我如何修复它,我不想在代码中运行大量请求以创建循环。
1个回答

21
在多表更新中,每个目标表中的行仅更新一次,即使通过连接返回了多次。
文档中得知:

当存在FROM子句时,实际上发生的是将目标表与fromlist中提到的表连接,每个连接的输出行都代表目标表的更新操作。使用FROM时,应确保连接对于要修改的每行最多产生一个输出行。换句话说,目标行不应与来自其他表的多行连接。如果确实如此,则只使用其中一个连接行来更新目标行,但将使用哪个连接行并不容易预测。

请使用这个替代方案:
UPDATE  user u
SET     balance = balance + p.amount
FROM    (
        SELECT  user_id, SUM(amount) AS amount
        FROM    payment
        WHERE   id IN (36, 38, 40)
        GROUP BY
                user_id
        ) p
WHERE   u.id = p.user_id

5
no - p 是子查询的别名,它已经完全定义好了。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接