sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan fjerner du dubletter i en tabel?

Dette vil beholde en af ​​dubletterne:

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

Din tabel har ikke en unik identifikator, der kan bruges til at "vælge en overlevende". Det er her Postgres' ctid er praktisk, da det er en intern unik identifikator for hver række. Bemærk, at du aldrig bør bruge ctid for mere end blot et enkelt udsagn. Det er ikke universelt unikke ting, men for kørselstiden af ​​en enkelt erklæring er det helt fint.

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

Hvis du vil slippe af med alt rækker, der er duplikeret:

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

Ingen af ​​løsningerne vil være hurtige på et stort bord. At oprette en ny tabel uden dubletter, som jjanes har vist, vil være meget hurtigere, hvis du har brug for et betydeligt antal rækker fra en stor tabel.



  1. Polymorfisk-lignende SQL-databasetabelstruktur

  2. Unikt indeks over postgresql-partitioner

  3. Oracle 11g:Standard til statisk værdi, når forespørgslen ikke returnerer noget

  4. MySQL vælg deltagelse hvor OG hvor