I allmänhet är det bästa praxis att sätta unika begränsningar på en tabell för att förhindra dubbletter av rader. Det kan dock hända att du arbetar med en databas där dubbletter av rader har skapats genom mänskliga fel, en bugg i din applikation eller orenad data från externa källor. Denna handledning kommer att lära dig hur du hittar dessa dubbletter av rader.
För att följa med behöver du läsbehörighet till din databas och ett verktyg för att söka efter din databas.
Identifiera dubblettkriterier
Det första steget är att definiera dina kriterier för en dubblettrad. Behöver du en kombination av två kolumner för att vara unika tillsammans, eller söker du helt enkelt efter dubbletter i en enda kolumn? I det här exemplet söker vi efter dubbletter i två kolumner i vår Användartabell:användarnamn och e-post.
Skriv fråga för att verifiera att det finns dubbletter
Den första frågan vi ska skriva är en enkel fråga för att verifiera om det verkligen finns dubbletter i tabellen. För vårt exempel ser min fråga ut så här:
SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1
HAVING
är viktigt här eftersom till skillnad från WHERE
, HAVING
filter på aggregerade funktioner.
Om några rader returneras betyder det att vi har dubbletter. I det här exemplet ser våra resultat ut så här:
användarnamn | e-post | räkna |
---|---|---|
Pete | [email protected] | 2 |
Jessica | [email protected] | 2 |
Miles | [email protected] | 2 |
Lista alla rader som innehåller dubbletter
I det föregående steget returnerade vår fråga en lista med dubbletter. Nu vill vi returnera hela posten för varje dubblettrad.
För att åstadkomma detta måste vi välja hela tabellen och sammanfoga den med våra dubbletter. Vår fråga ser ut så här:
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
Om du tittar noga kommer du att se att den här frågan inte är så komplicerad. Den initiala SELECT
väljer helt enkelt varje kolumn i användartabellen och förenar den sedan med den duplicerade datatabellen från vår första fråga. Eftersom vi förenar tabellen med sig själv, är det nödvändigt att använda alias (här använder vi a och b) för att märka de två versionerna.
Så här ser våra resultat ut för den här frågan:
id | användarnamn | e-post |
---|---|---|
1 | Pete | [email protected] |
6 | Pete | [email protected] |
12 | Jessica | [email protected] |
13 | Jessica | [email protected] |
2 | Miles | [email protected] |
9 | Miles | [email protected] |
Eftersom denna resultatuppsättning innehåller alla rad-ID kan vi använda den för att hjälpa oss att deduplicera raderna senare.