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_listLista wyrażeń tabel, umożliwiająca wyświetlanie kolumn z innych tabel w
WHEREwarunek i wyrażenia aktualizacji. Jest to podobne do listy tabel, które można określić wFROMKlauzulaSELECToś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?