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_list
Seznam tabulkových výrazů, které umožňují zobrazení sloupců z jiných tabulek v
WHERE
stavu a výrazů aktualizace. To je podobné seznamu tabulek, které lze zadat vFROM
KlauzuleSELECT
prohláš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?