PostgreSQL UPDATE - 查询左连接问题

时间:2011-01-27 11:24:03

标签: postgresql left-join

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 个答案:

答案 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