2011-01-27 15 views
8
UPDATE user 
SET balance = balance + p.amount 
FROM payments p WHERE user.id = p.user_id AND p.id IN (36,38,40) 

Ma aggiunge al saldo, solo la quantità valore del primo versamento 1936. Please help me come risolvere il problema, io non voglio fare il ciclo nel codice per eseguire un sacco di richieste.PostgreSQL AGGIORNAMENTO - query con sinistra unirsi problema

risposta

19

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 
+0

'p' non è definito. –

+4

no - p è l'alias per la sottoselezione, è perfettamente definito. – Rob

Problemi correlati