ProgrammatieSQL/BI Analyst

Hoe zoek en verwerk je duplicaten in grote SQL-tabellen om de uniciteit van sleutelgegevens te waarborgen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Het probleem van duplicaten in tabellen is een van de oudste in SQL, vooral verergerd door de massale groei van internetservices en de migratie van grote hoeveelheden gegevens. Aanvankelijk werd het probleem handmatig opgelost: duplicaten werden gevonden met eenmalige scripts en verwijderd, maar naarmate de hoeveelheid gegevens groeide, werd deze aanpak ineffectief.

Probleem: bij onnauwkeurige uploads, migraties of storingen ontstaan vaak tienduizenden rijen met identieke sleutelfuncties (bijvoorbeeld e-mail of paspoort). Dit leidt tot fouten bij integraties, onjuiste analyses en verlies van klantvertrouwen.

Oplossing: bouw rapporten over duplicaten met behulp van groeps- en raamfuncties; implementeer het verwijderen van duplicaten terwijl je één "correcte" behoudt; voeg beperkingen (UNIQUE) toe voor sleutelvelden en zorg voor regelmatige audits.

Voorbeeld van code:

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;

Duplicaten verwijderen (de rij met de minimale id behouden):

DELETE FROM users WHERE id NOT IN ( SELECT MIN(id) FROM users GROUP BY email );

Belangrijke kenmerken:

  • Gebruik van GROUP BY, HAVING voor het zoeken naar duplicaten
  • Automatisering van verwijderen via NOT IN/EXISTS/ROW_NUMBER()
  • Invoering van uniciteitsbeperkingen voor sleutelvelden

Misleidende vragen.

Kan DISTINCT worden gebruikt om duplicaten uit een tabel te verwijderen?

Nee, DISTINCT werkt alleen voor selecties (SELECT), het verwijdert geen rijen uit de tabel. Je moet DELETE of INSERT ... SELECT met DISTINCT gebruiken om een nieuwe schone tabel te maken.

Verwijdert de opdracht DELETE ... WHERE id NOT IN (SELECT MIN(id) ...) alle duplicaten gegarandeerd?

Nee, als er NULL in de sleutelkolom staat, kan zo'n query per ongeluk duplicaten achterlaten vanwege de manier waarop NULL-waarden worden vergeleken.

Is het voldoende om een UNIQUE INDEX te maken om nooit meer duplicaten te hebben?

Nee, de index beschermt alleen tegen nieuwe pogingen om duplicaten in te voegen, maar heeft geen invloed op reeds bestaande duplicaten in de tabel.

Veel voorkomende fouten en anti-patronen

  • Rechtstreekse verwijdering op basis van één kolom zonder rekening te houden met NULL of complexe sleutels
  • Gebrek aan constante monitoring en logging van duplicaten
  • Instellen van uniciteitsbeperkingen zonder voorafgaande schoonmaak van de tabel — leidt tot een fout bij het maken van de index

Voorbeeld uit het leven

Negatieve case

Een CRM-systeem kopieert gebruikers uit verschillende bronnen zonder rekening te houden met de uniciteit van e-mails, met 50.000 duplicaten in de database. Massale toevoeging van een UNIQUE-index leidt tot een storing, de service staat stil.

Voordelen:

  • Snelle implementatie (tot de index)

Nadelen:

  • Gegevensverlies, storingen van diensten, storingen bij ondersteuning

Positieve case

Een ingenieur analyseert regelmatig duplicaten via gespecialiseerde rapporten, maakt de database schoon en creëert unieke indexen. Voordat nieuwe gegevens worden gemigreerd, doet hij validatie.

Voordelen:

  • Schone sleutelgegevens
  • Minimalisering van fouten in analyses

Nadelen:

  • Vereist monitoringinstellingen en automatisering van procedures