Това ще запази един от дубликатите:
delete from join_table
where ctid not in (select min(ctid)
from join_table
group by id1, id2);
Вашата таблица няма уникален идентификатор, който може да се използва за „избиране на един оцелял“. Там е ctid
на Postgres е полезен, тъй като е вътрешен уникален идентификатор за всеки ред. Имайте предвид, че никога не трябва да използвате ctid
за повече от едно изявление. Това не са универсално уникални неща, но за времето на изпълнение на един израз е добре.
Пример за SQLFiddle:http://sqlfiddle.com/#!15/dabfc/1
Ако искате да се отървете от всички редове, които се дублират:
delete from join_table
where (id1, id2) in (select id1, id2
from join_table
group by id1, id2
having count(*) > 1);
Нито едно от решенията няма да бъде бързо на голяма маса. Създаването на нова таблица без дубликати, както jjanes показа, ще бъде много по-бързо, ако имате нужда от значителен брой редове от голяма таблица.