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 inFROM
Clausola di unSELECT
dichiarazione. Tieni presente che la tabella di destinazione non deve apparire infrom_list
, a meno che tu non intenda un self-join (nel qual caso deve apparire con un alias nelfrom_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?