sql >> Database >  >> RDS >> PostgreSQL

Hoe duplicaten in een tabel te verwijderen?

Hierdoor blijft een van de duplicaten behouden:

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

Uw tafel heeft geen unieke identificatie die kan worden gebruikt om "één overlevende te kiezen". Dat is waar Postgres' ctid is handig, want het is een interne unieke identifier voor elke rij. Merk op dat je nooit de ctid . moet gebruiken voor meer dan een enkele verklaring. Het is niet universeel uniek, maar voor de looptijd van een enkele verklaring is het prima.

SQLFiddle-voorbeeld:http://sqlfiddle.com/#!15/dabfc/1

Als je van alles af wilt komen rijen die zijn gedupliceerd:

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

Geen van beide oplossingen zal snel zijn op een grote tafel. Het maken van een nieuwe tabel zonder duplicaten, zoals jjanes heeft laten zien, gaat veel sneller als u een aanzienlijk aantal rijen uit een grote tabel nodig heeft.



  1. mysqli_connect():(HY000/2002):Verbindingstime-out op hosting

  2. hoe controleer ik de query's die momenteel in mijn mysql-database worden uitgevoerd?

  3. CONTROLEER BEPERKING op meerdere kolommen

  4. Meerdere update-query's uitvoeren in één instructie in PHP en mySQL