Vì null = null
đánh giá thành false
bạn cần kiểm tra xem cả hai trường đều null
ngoài kiểm tra bình đẳng:
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
Bạn cũng có thể sử dụng coalesce
hàm dễ đọc hơn:
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
Nhưng bạn cần phải cẩn thận về các giá trị mặc định (đối số cuối cùng để coalesce
).
Kiểu dữ liệu phải khớp với kiểu cột (ví dụ:để bạn không phải so sánh ngày với số) và giá trị mặc định phải sao cho nó không xuất hiện trong dữ liệu.
Ví dụ:coalesce(null, 1) = coalesce(1, 1)
là một tình huống bạn muốn tránh.
Cập nhật (về hiệu suất):
Seq Scan on table_two
- điều này cho thấy rằng bạn không có bất kỳ chỉ mục nào trên table_two
.
Vì vậy, nếu bạn cập nhật một hàng trong table_one
sau đó để tìm một hàng phù hợp trong table_two
cơ sở dữ liệu về cơ bản phải quét qua tất cả các hàng từng hàng một cho đến khi tìm thấy kết quả phù hợp.
Các hàng phù hợp có thể được tìm thấy nhanh hơn nhiều nếu các cột có liên quan được lập chỉ mục.
Trên mặt phẳng nếu table_one
có bất kỳ chỉ mục nào làm chậm quá trình cập nhật.
Theo hướng dẫn hiệu suất này
:
Một gợi ý khác từ cùng một hướng dẫn có thể hữu ích là:
Vì vậy, ví dụ:if table_one
một id
bạn có thể thêm một cái gì đó như
and table_one.id between x and y
đến where
điều kiện và chạy truy vấn nhiều lần để thay đổi các giá trị của x
và y
để tất cả các hàng được bao phủ.
Bạn có thể muốn cẩn thận khi sử dụng ANALYZE
tùy chọn với EXPLAIN
khi xử lý các câu lệnh có tác dụng phụ.Theo tài liệu
: