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

Come rimuovere i duplicati in una tabella?

Ciò manterrà uno dei duplicati:

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

La tua tabella non ha un identificatore univoco che potrebbe essere utilizzato per "scegliere un sopravvissuto". Ecco dove ctid di Postgres è utile, in quanto è un identificatore univoco interno per ogni riga. Nota che non dovresti mai usare il ctid per più di una singola affermazione. Non è una cosa universalmente unica, ma per il runtime di una singola istruzione va bene.

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

Se vuoi sbarazzarti di tutti righe duplicate:

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

Nessuna delle soluzioni sarà veloce su un grande tavolo. La creazione di una nuova tabella senza duplicati, come mostrato da jjanes, sarà molto più veloce se hai bisogno di un numero considerevole di righe da una tabella di grandi dimensioni.