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
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
: