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
: