Protože null = null vyhodnotí jako false musíte zkontrolovat, zda jsou obě pole null kromě kontroly rovnosti:
UPDATE table_one SET table_one.x = table_two.y
FROM table_two
WHERE
(table_one.invoice_number = table_two.invoice_number
OR (table_one.invoice_number is null AND table_two.invoice_number is null))
AND
(table_one.submitted_by = table_two.submitted_by
OR (table_one.submitted_by is null AND table_two.submitted_by is null))
AND
-- etc
Můžete také použít coalesce
funkce, která je čitelnější:
UPDATE table_one SET table_one.x = table_two.y
FROM table_two
WHERE
coalesce(table_one.invoice_number, '') = coalesce(table_two.invoice_number, '')
AND coalesce(table_one.submitted_by, '') = coalesce(table_two.submitted_by, '')
AND -- etc
Musíte si však dávat pozor na výchozí hodnoty (poslední argument pro coalesce ).
Jeho datový typ by se měl shodovat s typem sloupce (abyste nesrovnali například data s čísly) a výchozí nastavení by mělo být takové, aby se v datech neobjevilo
např. coalesce(null, 1) = coalesce(1, 1) je situace, které byste se chtěli vyhnout.
Aktualizace (týkající se výkonu):
Seq Scan on table_two - to naznačuje, že na table_two nemáte žádné indexy .
Pokud tedy aktualizujete řádek v table_one pak vyhledejte odpovídající řádek v table_two databáze v podstatě musí procházet všechny řádky jeden po druhém, dokud nenajde shodu.
Odpovídající řádky by mohly být nalezeny mnohem rychleji, kdyby byly příslušné sloupce indexovány.
Na druhé straně, pokud table_one má nějaké indexy, které pak zpomalují aktualizaci.
Podle tohoto průvodce výkonem
:
Další návrh ze stejného průvodce, který by mohl být užitečný, je:
Například pokud table_one id můžete přidat něco jako
and table_one.id between x and y
do where podmínku a několikrát spusťte dotaz změnou hodnot x a y tak, aby byly pokryty všechny řádky.
Možná budete chtít být opatrní při používání ANALYZE možnost pomocí EXPLAIN při řešení prohlášení s vedlejšími účinky. Podle dokumentace
: