Trovare ed eliminare record (semi-)duplicati in SQL
Lo ammetto: non é certo la cosa più complicata del mondo eliminare le righe duplicate in un database; quando serve però non viene mai in mente un modo per farlo. Questo post lo categorizzo quindi come mio promemoria!
Perché (semi-)duplicati? Parto dall’esempio pratico: aggiungere una chiave ad una tabella già piena di dati. Ovviamente, per la legge di Murphy, i valori dei campi che dovrebbero diventare chiave non saranno mai tutti diversi. Voglio quindi eliminare dalla tabella i record con chiavi uguali, preservandone solo una copia per ognuno.
Poniamo che la nostra tabella di chiami table1 con campi field1,field2,field3 (la fantasia nel dare i nomi é il mio forte). Vogliamo far diventare field1 e field2 chiave primaria. Per eliminare i duplicati eseguiamo:
SELECT * FROM db.table1 as t2 WHERE (t2.field1,t2.field2,t2.field3) not in ( SELECT t1.field1,t1.field2, min(t1.field3) FROM db.table1 as t1 group by t1.field1,t1.field2)
Fatto! Come preannunciato niente di emozionante… ;-)
Ovviamente la regola min(t1.field3)
puo’ essere cambiata a piacimento per conservare il record piu’ conveniente ai fini dell’applicazione.