Aangezien null =null
evalueert tot false
je moet controleren of twee velden beide null
zijn naast gelijkheidscontrole:
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
U kunt ook de samenvloeien
functie die beter leesbaar is:
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
Maar je moet voorzichtig zijn met de standaardwaarden (laatste argument om samen te voegen
).
Het gegevenstype moet overeenkomen met het kolomtype (zodat u bijvoorbeeld geen datums met getallen gaat vergelijken) en de standaardinstelling moet zodanig zijn dat het niet in de gegevens verschijnt
Bijvoorbeeld coalesce(null, 1) =coalesce(1, 1)
is een situatie die u wilt vermijden.
Update (met betrekking tot prestaties):
Seq Scan op table_two
- dit suggereert dat je geen indexen hebt op table_two
.
Dus als je een rij bijwerkt in table_one
om vervolgens een overeenkomende rij te vinden in table_two
de database moet in principe alle rijen één voor één doorzoeken totdat deze een overeenkomst vindt.
De overeenkomende rijen zouden veel sneller gevonden kunnen worden als de relevante kolommen waren geïndexeerd.
Aan de andere kant als table_one
heeft indexen die de update vertragen.
Volgens deze prestatiegids
:
Een andere suggestie uit dezelfde gids die nuttig kan zijn, is:
Dus bijvoorbeeld als table_one
een id
kolom zou je zoiets kunnen toevoegen als
and table_one.id between x and y
naar de waar
voorwaarde en voer de query meerdere keren uit en verander de waarden van x
en y
zodat alle rijen bedekt zijn.
Misschien wilt u voorzichtig zijn bij het gebruik van de ANALYSE
optie met UITLEG
bij het omgaan met verklaringen met neveneffecten.Volgens documentatie
: