Twoja UPDATE
zapytanie powinno wyglądać tak:
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
Tak jak to zrobiłeś, nie było połączenia między poszczególnymi rzędami dwóch tabel. Każdy wiersz zostałby pobrany z table1
dla każdego wiersza w table2
. To nie miało sensu (w drogi sposób), a także powodowało błąd składni, ponieważ wyrażenie podzapytania w tym miejscu może zwrócić tylko jedną wartość.
Naprawiłem to, łącząc dwie tabele na table2_id
. Zastąp to tym, co faktycznie łączy te dwie rzeczy.
Przepisałem UPDATE
dołączyć do table1
(z FROM
klauzuli) zamiast uruchamiania skorelowanych podzapytań, ponieważ jest to zazwyczaj szybsze o rząd wielkości.
Zapobiega to również temu table2.val2
zostanie unieważniony, gdy nie zostanie znaleziony pasujący wiersz w table1
. Zamiast tego nic dzieje się z takimi wierszami w tej formie zapytania.
Możesz dodać wyrażenia tabelowe do FROM
lista jak w zwykłym SELECT
(tabele, podzapytania, funkcje zwracania zestawu, ...). Instrukcja:
from_list
Lista wyrażeń tabel, umożliwiająca wyświetlanie kolumn z innych tabel w
WHERE
warunek i wyrażenia aktualizacji. Jest to podobne do listy tabel, które można określić wFROM
KlauzulaSELECT
oświadczenie. Pamiętaj, że tabela docelowa nie może pojawić się nafrom_list
, chyba że zamierzasz samodołączyć (w takim przypadku musi pojawić się z aliasem wfrom_list
).
Ostatnie WHERE
klauzula zapobiega aktualizacjom, które niczego nie zmienią - co praktycznie zawsze jest dobrym pomysłem (prawie pełny koszt, ale bez zysku, obowiązują egzotyczne wyjątki). Jeśli zarówno stara, jak i nowa wartość są gwarantowane jako NOT NULL
, uprość do:
AND t2.val2 <> t1.val1
- Jak (lub mogę) WYBRAĆ ODRÓŻNIENIE w wielu kolumnach?