Dzięki temu jeden z duplikatów zostanie zachowany:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
Twoja tabela nie ma unikalnego identyfikatora, którego można by użyć do „wybrania jednego ocalałego”. To tam ctid
Postgresa przydaje się, ponieważ jest wewnętrznym unikalnym identyfikatorem dla każdego wiersza. Pamiętaj, że nigdy nie powinieneś używać ctid
więcej niż tylko jedno oświadczenie. Nie jest to uniwersalnie unikatowa rzecz, ale w czasie wykonywania pojedynczej instrukcji jest w porządku.
Przykład SQLFiddle:http://sqlfiddle.com/#!15/dabfc/1
Jeśli chcesz pozbyć się wszystkich wiersze, które są zduplikowane:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
Żadne rozwiązanie nie będzie szybkie na dużym stole. Tworzenie nowej tabeli bez duplikatów, jak pokazał jjanes, będzie znacznie szybsze, jeśli potrzebujesz znacznej liczby wierszy z dużej tabeli.