PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggiorna una colonna di una tabella con una colonna di un'altra tabella in PostgreSQL

Il tuo UPDATE la query dovrebbe essere simile a questa:

UPDATE table2 t2
SET    val2 = t1.val1
FROM   table1 t1
WHERE  t2.table2_id = t1.table2_id
AND    t2.val2 IS DISTINCT FROM t1.val1;  -- optional, see below

Per come l'hai fatto, non c'era alcun collegamento tra le singole righe delle due tabelle. Ogni riga verrebbe recuperata da table1 per ogni riga in table2 . Questo non aveva senso (in modo costoso) e ha anche attivato l'errore di sintassi, perché un'espressione di sottoquery in questo posto può restituire solo un singolo valore.

L'ho risolto unendo le due tabelle su table2_id . Sostituiscilo con ciò che effettivamente collega i due.

Ho riscritto il UPDATE per partecipare a table1 (con il FROM clausola) invece di eseguire sottoquery correlate, perché in genere è più veloce di un ordine di grandezza.
Evita anche che table2.val2 verrebbe annullato se non viene trovata alcuna riga corrispondente in table1 . Invece, niente accade a tali righe con questo modulo della query.

Puoi aggiungere espressioni di tabella a FROM elenco come in un semplice SELECT (tabelle, sottoquery, funzioni di restituzione degli insiemi, ...). Il manuale:

from_list

Un elenco di espressioni di tabella, che consente di visualizzare le colonne di altre tabelle in WHERE condizione e le espressioni di aggiornamento. Questo è simile all'elenco di tabelle che possono essere specificate in FROM Clausola di un SELECT dichiarazione. Tieni presente che la tabella di destinazione non deve apparire in from_list , a meno che tu non intenda un self-join (nel qual caso deve apparire con un alias nel from_list ).

Il WHERE finale la clausola impedisce aggiornamenti che non cambierebbero nulla, il che è praticamente sempre una buona idea (costo quasi pieno ma nessun guadagno, si applicano eccezioni esotiche). Se è garantito che il vecchio e il nuovo valore siano NOT NULL , semplificare in:

AND   t2.val2 <> t1.val1
  • Come faccio (o posso) SELEZIONA DISTINCT su più colonne?