Da null =null wird zu false ausgewertet Sie müssen prüfen, ob zwei Felder beide null sind zusätzlich zur Gleichheitsprüfung:
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
Sie können auch den Code
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
Aber Sie müssen vorsichtig mit den Standardwerten sein (letztes Argument für coalesce ).
Der Datentyp sollte mit dem Spaltentyp übereinstimmen (damit Sie beispielsweise keine Daten mit Zahlen vergleichen) und der Standardwert sollte so sein, dass er nicht in den Daten erscheint
z coalesce(null, 1) =coalesce(1, 1) ist eine Situation, die Sie vermeiden möchten.
Update (in Bezug auf die Leistung):
Seq Scan auf table_two - Dies deutet darauf hin, dass Sie keine Indizes auf table_two haben .
Wenn Sie also eine Zeile in table_one aktualisieren dann um eine passende Zeile in table_two zu finden die Datenbank muss grundsätzlich alle Zeilen nacheinander durchsuchen, bis sie eine Übereinstimmung findet.
Die übereinstimmenden Zeilen könnten viel schneller gefunden werden, wenn die relevanten Spalten indiziert wären.
Auf der Rückseite, wenn table_one hat dann irgendwelche Indizes, die das Update verlangsamen.
Laut dieser Leistungsleitfaden
:
Ein weiterer Vorschlag aus demselben Leitfaden, der hilfreich sein könnte, ist:
Also zum Beispiel wenn table_one eine id Spalte könnten Sie so etwas hinzufügen wie
and table_one.id between x and y
zum wo Bedingung und führen Sie die Abfrage mehrmals aus, indem Sie die Werte von x ändern und y sodass alle Zeilen abgedeckt sind.
Sie sollten vorsichtig sein, wenn Sie ANALYZE verwenden Option mit EXPLAIN beim Umgang mit Anweisungen mit Nebeneffekten. Gemäß Dokumentation
: