Vaše UPDATE dotaz by měl vypadat takto:
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
Jak jste to měli, mezi jednotlivými řádky dvou tabulek nebyla žádná vazba. Každý řádek by byl načten z table1 pro každý řádek v table2 . To nedávalo smysl (nákladným způsobem) a také spustilo chybu syntaxe, protože výraz poddotazu na tomto místě může vrátit pouze jednu hodnotu.
Opravil jsem to spojením dvou tabulek na table2_id . Nahraďte to tím, co je skutečně spojuje.
Přepsal jsem UPDATE připojit se k table1 (pomocí značky FROM klauzule) namísto spouštění korelovaných poddotazů, protože to je obvykle řádově rychlejší.
Také to zabrání table2.val2 bude zrušeno, pokud v table1 není nalezen žádný odpovídající řádek . Místo toho nic se stane s takovými řádky s touto formou dotazu.
Do FROM můžete přidat tabulkové výrazy seznam jako v prostém SELECT (tabulky, poddotazy, funkce vracející sady, ...). Manuál:
from_listSeznam tabulkových výrazů, které umožňují zobrazení sloupců z jiných tabulek v
WHEREstavu a výrazů aktualizace. To je podobné seznamu tabulek, které lze zadat vFROMKlauzuleSELECTprohlášení. Všimněte si, že cílová tabulka se nesmí objevit vfrom_list, pokud nemáte v úmyslu vlastní připojení (v takovém případě se musí objevit s aliasem vfrom_list).
Poslední WHERE klauzule brání aktualizacím, které by nic nezměnily – což je prakticky vždy dobrý nápad (téměř plné náklady, ale žádný zisk, platí exotické výjimky). Pokud je zaručeno, že stará i nová hodnota bude NOT NULL , zjednodušte na:
AND t2.val2 <> t1.val1
- Jak mohu (nebo mohu) SELECT DISTINCT na více sloupcích?