PostgreSQL UPDATE - запрос с проблемой левого соединения - PullRequest
9 голосов
/ 27 января 2011
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 Ответ

20 голосов
/ 27 января 2011

В нескольких таблицах UPDATE каждая строка в целевой таблице обновляется только один раз, даже если она возвращается более одного раза объединением.

Из документов :

Когда присутствует условие FROM, то, по сути, происходит то, что целевая таблица присоединяется к таблицам, упомянутым в списке from, и каждая выходная строка объединения представляет операцию обновления для целевой таблицы. При использовании 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
...