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

Làm thế nào để loại bỏ các bản sao trong một bảng?

Điều này sẽ giữ một trong các bản sao:

delete from join_table
where ctid not in (select min(ctid)
                   from join_table
                   group by id1, id2);

Bảng của bạn không có số nhận dạng duy nhất có thể được sử dụng để "chọn một người sống sót". Đó là nơi Postgres 'ctid rất hữu ích, vì nó là số nhận dạng duy nhất nội bộ cho mỗi hàng. Lưu ý rằng bạn không bao giờ được sử dụng ctid không chỉ là một tuyên bố duy nhất. Nó không phải là một thứ độc nhất vô nhị nhưng đối với thời gian chạy của một câu lệnh duy nhất thì nó vẫn ổn.

Ví dụ về SQLFiddle: http://sqlfiddle.com/#!15/dabfc/1

Nếu bạn muốn thoát khỏi tất cả các hàng bị trùng lặp:

delete from join_table
where (id1, id2) in (select id1, id2
                     from join_table
                     group by id1, id2
                     having count(*) > 1);

Cả hai giải pháp sẽ không nhanh chóng trên một bàn lớn. Tạo một bảng mới không có bản sao như jjanes đã trình bày sẽ nhanh hơn nhiều nếu bạn cần một số lượng hàng đáng kể từ một bảng lớn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển đổi một cột trong bảng thành một kiểu dữ liệu khác

  2. Postgres tiêu đề cột động (từ một bảng khác)

  3. Cách thoát chuỗi khi khớp mẫu trong PostgreSQL

  4. ValueError:Không thể thêm *:trường hợp trên mặc định cơ sở dữ liệu, giá trị trên cơ sở dữ liệu Không có

  5. Python 3.7 psycopg2 - Lỗi Xcode Error:lệnh 'gcc' không thành công với trạng thái thoát 1