In un tavolo multiplo UPDATE
, ogni riga nella tabella di destinazione viene aggiornata solo una volta, anche se viene restituita più di una volta dal join.
Dal docs:
Quando una clausola FROM
è presente, ciò che accade essenzialmente è che la tabella di destinazione è unita alle tabelle indicate nel fromlist, e ogni riga uscita del join rappresenta un'operazione di aggiornamento per la tabella di destinazione. Quando si utilizza FROM
, è necessario assicurarsi che il join produca al massimo una riga di output per ogni riga da modificare. In altre parole, una riga di destinazione non dovrebbe unirsi a più di una riga dalle altre tabelle. In tal caso, solo una delle righe di join verrà utilizzata per aggiornare la riga di destinazione, ma quale sarà utilizzato non è facilmente prevedibile.
Utilizzare questo invece:
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
'p' non è definito. –
no - p è l'alias per la sottoselezione, è perfettamente definito. – Rob