Il problema dei duplicati nelle tabelle è uno dei più antichi in SQL, specialmente intensificato dalla crescita massiccia dei servizi Internet e dalla migrazione di grandi masse di dati. Inizialmente, il problema veniva risolto manualmente: si trovavano i duplicati con script singoli, li si eliminava, ma con la crescita dei dati questo approccio diventava inefficace.
Problematica: durante il caricamento, la migrazione o in caso di errori, spesso si generano decine di migliaia di righe con le stesse chiavi (ad esempio, email o documento d’identità). Ciò porta a errori durante le integrazioni, analisi errate e perdita di fiducia da parte dei clienti.
Soluzione: costruire report sui duplicati tramite aggregazione e funzioni finestra; implementare l'eliminazione dei record duplicati mantenendo uno "giusto"; aggiungere vincoli (UNIQUE) per i campi chiave e auditing regolare obbligatorio.
Esempio di codice
WITH Duplicates AS ( SELECT email, COUNT(*) AS cnt FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.* FROM users u JOIN Duplicates d ON u.email = d.email ORDER BY u.email, u.id;
Eliminazione dei duplicati (mantenendo la riga con id minimo):
DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );
Caratteristiche chiave:
È possibile utilizzare DISTINCT per eliminare i duplicati da una tabella?
No, DISTINCT funziona solo per le selezioni (SELECT), non elimina righe dalla tabella. È necessario utilizzare DELETE o INSERT ... SELECT con DISTINCT per creare una nuova tabella pulita.
Elimina il comando DELETE ... WHERE id NOT IN (SELECT MIN(id) ...) tutti i duplicati in modo garantito?
No, se nella colonna chiave ci sono NULL, una tale query potrebbe erroneamente lasciare duplicati a causa delle particolarità del confronto tra valori NULL.
È sufficiente creare un UNIQUE INDEX per non avere mai più duplicati?
No, l'indice proteggerà solo da nuovi tentativi di inserimento di duplicati, ma non influisce sui già esistenti nella tabella.
Un sistema CRM copia utenti da diverse fonti, senza considerare l'unicità dell'email; ci sono 50000 duplicati nel database. L'aggiunta massiccia di un indice UNIQUE porta a un blocco, il servizio va in crisi.
Vantaggi:
Svantaggi:
Un ingegnere analizza regolarmente i duplicati tramite report specializzati, pulisce il database, crea indici unici. Prima della migrazione di nuovi dati esegue la validazione.
Vantaggi:
Svantaggi: