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

Aktualizujte příkaz pomocí klauzule WHERE, která obsahuje sloupce s hodnotami null

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 :



  1. Vytvořte funkci Inline Table-Valued Function (ITVF) na serveru SQL Server

  2. Levé spojení nebo výběr z více tabulek pomocí čárky (,)

  3. Jak nainstalovat a nakonfigurovat MaxScale pro MariaDB

  4. Generování dat mezi dvěma daty