PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Cập nhật câu lệnh bằng cách sử dụng mệnh đề WHERE chứa các cột có Giá trị rỗng

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 xy để 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 :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khối mã ẩn danh PL / pgSQL

  2. Quyền truy cập lỗi máy chủ OpenERP bị từ chối

  3. Xuất sang CSV và Nén bằng GZIP trong postgres

  4. Khắc phục ‘LỖI:cột“ colname ”không tồn tại’ trong PostgreSQL khi sử dụng UNION, EXCEPT hoặc INTERSECT

  5. Không thể cài đặt pg gem trong Mavericks bằng Postgres.app