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 *
và 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]')