Đ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.