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:
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.
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:
Nadelen:
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:
Nadelen: