sql >> Databasteknik >  >> RDS >> PostgreSQL

Uppdatera satsen med hjälp av en WHERE-sats som innehåller kolumner med null-värden

Eftersom null =null utvärderas till falskt du måste kontrollera om två fält båda är null förutom jämställdhetskontroll:

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

Du kan också använda sammansmält funktion som är mer läsbar:

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

Men du måste vara försiktig med standardvärdena (sista argumentet för att sammansmälta). ).
Dess datatyp ska matcha kolumntypen (så att du inte jämför datum med siffror till exempel) och standardinställningen ska vara sådan att den inte visas i datan
T.ex. coalesce(null, 1) =coalesce(1, 1) är en situation du skulle vilja undvika.

Uppdatering (avseende prestanda):

Seq Scan on table_two - detta tyder på att du inte har några index på table_two .
Så om du uppdaterar en rad i table_one sedan för att hitta en matchande rad i table_two databasen måste i princip skanna igenom alla rader en efter en tills den hittar en matchning.
De matchande raderna kunde hittas mycket snabbare om de relevanta kolumnerna indexerades.

På baksidan om table_one har några index då som saktar ner uppdateringen.
Enligt denna prestationsguide :

Ett annat förslag från samma guide som kan vara till hjälp är:

Så till exempel om table_one ett id kolumn du kan lägga till något som

and table_one.id between x and y

till var villkor och kör frågan flera gånger och ändra värdena för x och y så att alla rader täcks.

Du kanske vill vara försiktig när du använder ANALYSE alternativ med EXPLAIN vid hantering av uttalanden med biverkningar. Enligt dokumentation :



  1. Byt från JsonStringType till JsonBinaryType när projektet använder både MySQL och PostgreSQL

  2. Fråga efter en MySQL-databas från en NodeJS AWS Lambda-funktion

  3. SQLite REPLACE-sats

  4. Fel vid utskrift av REFCURSOR-variabel som OUT-parameter i proceduren i Oracle 11g