ProgrammazioneSQL/BI Analyst

Как реализовать поиск и обработку дубликатов в больших таблицах SQL, чтобы гарантировать уникальность ключевых данных?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Utilizzo di GROUP BY, HAVING per la ricerca di duplicati
  • Automazione dell'eliminazione tramite NOT IN/EXISTS/ROW_NUMBER()
  • Introduzione di vincoli di unicità per i campi chiave

Domande trabocchetto.

È 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.

Errori comuni e anti-pattern

  • Eliminazione diretta basata su una sola colonna senza considerare i valori NULL o chiavi complesse
  • Mancanza di monitoraggio e registrazione costante dei duplicati
  • Impostazione di vincoli di unicità senza una pulizia preventiva della tabella — porterà a un errore nella creazione dell'indice

Esempio dalla vita reale

Caso negativo

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:

  • Implementazione rapida (prima dell'indice)

Svantaggi:

  • Perdita di dati, blocchi dei servizi, problemi di supporto

Caso positivo

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:

  • Dati chiave puliti
  • Minimizzazione degli errori nell'analisi

Svantaggi:

  • Richiede impostazioni di monitoraggio e automazione delle procedure