Тъй като null = null дава оценка на false трябва да проверите дали и двете полета са null в допълнение към проверката за равенство:
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
Можете също така да използвате coalesce
функция, която е по-четлива:
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
Но трябва да внимавате със стойностите по подразбиране (последен аргумент за coalesce ).
Типът на данните трябва да съответства на типа на колоната (така че да не сравнявате дати с числа например) и по подразбиране трябва да е такъв, че да не се появява в данните
Напр. coalesce(null, 1) = coalesce(1, 1) е ситуация, която бихте искали да избегнете.
Актуализация (по отношение на производителността):
Seq Scan on table_two - това предполага, че нямате никакви индекси на table_two .
Така че, ако актуализирате ред в table_one след това да намерите съвпадащ ред в table_two базата данни основно трябва да сканира всички редове един по един, докато намери съвпадение.
Съвпадащите редове биха могли да бъдат намерени много по-бързо, ако съответните колони бяха индексирани.
От обратната страна, ако table_one има някакви индекси, които забавят актуализацията.
Според това ръководство за ефективност
:
Друго предложение от същото ръководство, което може да бъде полезно, е:
Така например, ако table_one id можете да добавите нещо като
and table_one.id between x and y
до where условие и стартирайте заявката няколко пъти, променяйки стойностите на x и y така че да бъдат покрити всички редове.
Може да искате да внимавате, когато използвате ANALYZE опция с EXPLAIN когато работите с изявления със странични ефекти. Според документация
: