sql >> Databáze >  >> RDS >> PostgreSQL

Aktualizujte sloupec tabulky sloupcem jiné tabulky v PostgreSQL

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 v FROM Klauzule SELECT prohlášení. Všimněte si, že cílová tabulka se nesmí objevit v from_list , pokud nemáte v úmyslu vlastní připojení (v takovém případě se musí objevit s aliasem v from_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?


  1. Vytvořte úlohu SQL Server Agent v Azure Data Studio

  2. Jak funguje justify_interval() v PostgreSQL

  3. 3 metody opětovného sestavení všech indexů pro všechny tabulky pomocí T-SQL v databázi SQL Server

  4. Jak získat definici tabulky v Oracle?