Тъй като 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
когато работите с изявления със странични ефекти. Според документация
: