UPDATE user
SET balance = balance + p.amount
FROM payments p WHERE user.id = p.user_id AND p.id IN (36,38,40)
但它增加了余额,只增加了1936年第一笔付款的金额。 请帮我解决一下,我不想在代码中循环来运行很多请求。
答案 0 :(得分:20)
在多表UPDATE
中,目标表中的每一行只更新一次,即使连接多次返回也是如此。
来自docs:
当存在
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