Generelt er det bedste praksis at sætte unikke begrænsninger på en tabel for at forhindre duplikerede rækker. Du kan dog opleve, at du arbejder med en database, hvor duplikerede rækker er blevet oprettet på grund af menneskelige fejl, en fejl i din applikation eller urensede data fra eksterne kilder. Denne vejledning vil lære dig, hvordan du finder disse dublerede rækker.
For at følge med skal du have læseadgang til din database og et værktøj til at forespørge i din database.
Identificer duplikatkriterier
Det første trin er at definere dine kriterier for en dubletrække. Har du brug for en kombination af to kolonner for at være unikke sammen, eller søger du blot efter dubletter i en enkelt kolonne? I dette eksempel søger vi efter dubletter på tværs af to kolonner i vores brugertabel:brugernavn og e-mail.
Skriv forespørgsel for at bekræfte, at dubletter eksisterer
Den første forespørgsel, vi skal skrive, er en simpel forespørgsel for at verificere, om dubletter faktisk findes i tabellen. For vores eksempel ser min forespørgsel sådan ud:
SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1
HAVING
er vigtig her, fordi i modsætning til WHERE
, HAVING
filtre på aggregerede funktioner.
Hvis nogen rækker returneres, betyder det, at vi har dubletter. I dette eksempel ser vores resultater således ud:
brugernavn | tæller | |
---|---|---|
Pete | [email protected] | 2 |
Jessica | [email protected] | 2 |
Miles | [email protected] | 2 |
Vis alle rækker, der indeholder dubletter
I det forrige trin returnerede vores forespørgsel en liste over dubletter. Nu vil vi returnere hele posten for hver dubletrække.
For at opnå dette skal vi vælge hele tabellen og forbinde den med vores duplikerede rækker. Vores forespørgsel ser sådan ud:
SELECT a.*
FROM users a
JOIN (SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING count(*) > 1 ) b
ON a.username = b.username
AND a.email = b.email
ORDER BY a.email
Hvis du ser godt efter, vil du se, at denne forespørgsel ikke er så kompliceret. Den indledende SELECT
vælger blot hver kolonne i brugertabellen og forbinder den derefter med den duplikerede datatabel fra vores første forespørgsel. Fordi vi forbinder tabellen med sig selv, er det nødvendigt at bruge aliaser (her bruger vi a og b) til at mærke de to versioner.
Sådan ser vores resultater ud for denne forespørgsel:
id | brugernavn | |
---|---|---|
1 | Pete | [email protected] |
6 | Pete | [email protected] |
12 | Jessica | [email protected] |
13 | Jessica | [email protected] |
2 | Miles | [email protected] |
9 | Miles | [email protected] |
Fordi dette resultatsæt indeholder alle række-id'erne, kan vi bruge det til at hjælpe os med at deduplikere rækkerne senere.