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
: