PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изявление за актуализиране с помощта на клауза WHERE, която съдържа колони с нулеви стойности

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.lang.ClassNotFoundException:org.postgresql.Driver, Android

  2. Как да съхраня таблица с данни в база данни?

  3. MySQL колони с DEFAULT NULL - стилистичен избор, или е така?

  4. Използване на една и съща колона няколко пъти в клаузата WHERE

  5. Бърза заявка за нормализиране на SQL данни