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

Cách xóa các hàng trùng lặp mà không có số nhận dạng duy nhất

Tôi thích giải pháp của @ erwin-brandstetter, nhưng muốn hiển thị một giải pháp với USING từ khóa:

DELETE   FROM table_with_dups T1
  USING       table_with_dups T2
WHERE  T1.ctid    < T2.ctid       -- delete the "older" ones
  AND  T1.name    = T2.name       -- list columns that define duplicates
  AND  T1.address = T2.address
  AND  T1.zipcode = T2.zipcode;

Nếu bạn muốn xem lại các bản ghi trước khi xóa chúng, thì chỉ cần thay thế DELETE với SELECT *USING bằng dấu phẩy , , tức là

SELECT * FROM table_with_dups T1
  ,           table_with_dups T2
WHERE  T1.ctid    < T2.ctid       -- select the "older" ones
  AND  T1.name    = T2.name       -- list columns that define duplicates
  AND  T1.address = T2.address
  AND  T1.zipcode = T2.zipcode;

Cập nhật:Tôi đã thử nghiệm một số giải pháp khác nhau ở đây về tốc độ. Nếu bạn không mong đợi có nhiều bản sao, thì giải pháp này hoạt động tốt hơn nhiều so với những giải pháp có NOT IN (...) vì những mệnh đề đó tạo ra nhiều hàng trong truy vấn con.

Nếu bạn viết lại truy vấn để sử dụng IN (...) thì nó hoạt động tương tự như giải pháp được trình bày ở đây, nhưng mã SQL trở nên ít ngắn gọn hơn nhiều.

Cập nhật 2:Nếu bạn có NULL các giá trị trong một trong các cột chính (mà bạn thực sự không nên IMO), thì bạn có thể sử dụng COALESCE() trong điều kiện cho cột đó, ví dụ:

  AND COALESCE(T1.col_with_nulls, '[NULL]') = COALESCE(T2.col_with_nulls, '[NULL]')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT DISTINCT chậm hơn mong đợi trên bảng của tôi trong PostgreSQL

  2. Hàm SQL rất chậm so với truy vấn không có trình bao bọc hàm

  3. Lưu đầu ra từ hàm sql vào tệp csv (COPY) với tên tệp động

  4. Kiểm tra hàm null với các tham số khác nhau

  5. Có gì mới trong PostgreSQL 11