PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Perbarui pernyataan menggunakan klausa WHERE yang berisi kolom dengan Nilai nol

Karena null = null mengevaluasi ke false anda perlu memeriksa apakah dua bidang keduanya null selain pemeriksaan kesetaraan:

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

Anda juga dapat menggunakan coalesce fungsi yang lebih mudah dibaca:

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

Tetapi Anda harus berhati-hati dengan nilai default (argumen terakhir untuk coalesce ).
Tipe datanya harus cocok dengan tipe kolom (sehingga Anda tidak membandingkan tanggal dengan angka misalnya) dan defaultnya harus sedemikian rupa sehingga tidak muncul dalam data
Misalnya coalesce(null, 1) = coalesce(1, 1) adalah situasi yang ingin Anda hindari.

Pembaruan (mengenai kinerja):

Seq Scan on table_two - ini menunjukkan bahwa Anda tidak memiliki indeks apa pun di table_two .
Jadi jika Anda memperbarui baris di table_one kemudian untuk menemukan baris yang cocok di table_two database pada dasarnya harus memindai semua baris satu per satu sampai menemukan kecocokan.
Baris yang cocok dapat ditemukan lebih cepat jika kolom yang relevan diindeks.

Di sisi lain jika table_one memiliki indeks yang memperlambat pembaruan.
Menurut panduan kinerja ini :

Saran lain dari panduan yang sama yang mungkin berguna adalah:

Jadi misalnya jika table_one sebuah id kolom Anda dapat menambahkan sesuatu seperti

and table_one.id between x and y

ke where kondisi dan jalankan kueri beberapa kali dengan mengubah nilai x dan y sehingga semua baris tertutup.

Anda mungkin ingin berhati-hati saat menggunakan ANALYZE opsi dengan EXPLAIN saat menangani pernyataan dengan efek sid.Menurut dokumentasi :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Validasi Django IntegerRangeField gagal

  2. Menggunakan PostgresSQL INTERVAL di SQLAlchemy di mana durasi disimpan secara dinamis dalam DB dan bukan merupakan parameter

  3. Mengapa kueri saya yang melibatkan pembagian dan COUNT selalu menghasilkan 1?

  4. Bagaimana cara membuat tabel Postgres dengan kunci utama gabungan yang unik?

  5. Minggu di antara dua tanggal