Följande frågor kan användas för att returnera dubbletter av rader i SQLite.
Här innehåller dubblettraderna dubblettvärden över alla kolumner, inklusive ID-kolumnen.
Exempeldata
Anta att vi har en tabell med följande data:
VÄLJ * FRÅN Husdjur;
Resultat:
PetId PetName PetType----- ------- -------1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
De två första raderna är dubbletter, liksom de tre sista raderna. Det beror på att alla tre kolumnerna innehåller samma värden i varje dubblettrad.
Alternativ 1
Vi kan använda följande fråga för att se hur många rader som är dubbletter:
SELECT PetId, PetName, PetType, COUNT(*) AS "Count"FROM PetsGROUP BY PetId, PetName, PetTypeORDER BY PetId;
Resultat:
PetId PetName PetType Count----- ------- ------- -----1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1 4 Bark Dog 3
Här grupperade vi raderna efter alla kolumner och returnerade radantalet för varje grupp. Detta talar om för oss om en rad är unik (med ett antal 1) eller en dubblett (med ett antal större än 1).
Vi kan sortera efter antal i fallande ordning, så att raderna med flest dubbletter visas först:
VÄLJ PetId, PetName, PetType, COUNT(*) AS "Count"FRÅN PetsGROUP BY PetId, PetName, PetTypeORDER BY Count(*) DESC;
Resultat:
PetId PetName PetType Count----- ------- ------- -----4 Bark Dog 3 1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1
Alternativ 2
Om vi bara vill ha dubblettraderna listade kan vi använda koden HAVING
sats för att endast returnera rader med ett antal större än 1:
VÄLJ PetId, PetName, PetType, COUNT(*) AS "Count"FRÅN PetsGROUP BY PetId, PetName, PetTypeHAR COUNT(*)> 1ORDER BY PetId;
Resultat:
PetId PetName PetType Count----- ------- ------- -----1 Wag Dog 2 4 Bark Dog 3
Alternativ 3
Ett annat alternativ är att använda ROW_NUMBER()
fönsterfunktion:
SELECT *, ROW_NUMBER() OVER ( PARTITION BY PetId, PetName, PetType ORDER BY PetId, PetName, PetType ) AS Row_NumberFROM Pets;
Resultat:
PetId PetName PetType Row_Number----- ------- ------- ----------1 Wag Dog 1 1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1 4 Bark Dog 1 4 Bark Dog 2 4 Bark Dog 3
PARTITION BY
satsen delar resultatuppsättningen som produceras av FROM
sats i partitioner som funktionen tillämpas på. När vi anger partitioner för resultatuppsättningen, gör varje partition att numreringen börjar om igen (dvs. numreringen börjar på 1 för den första raden i varje partition).
Alternativ 4
Vi kan använda ovanstående fråga som ett vanligt tabelluttryck:
MED cte AS ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY PetId, PetName, PetType ORDER BY PetId, PetName, PetType ) AS Row_Number FROM Pets ) SELECT * FROM cte WHERE Row_Number <> 1;
Resultat:
PetId PetName PetType Row_Number----- ------- ------- ----------1 Wag Dog 2 4 Bark Dog 2 4 Bark Dog 3Detta returnerar bara överflödiga rader från matchande dubbletter. Så om det finns två identiska rader returneras en av dem. Om det finns tre identiska rader returneras två, och så vidare.
Den här frågan kan vara användbar för att visa hur många rader som kommer att tas bort från tabellen i en de-dupingoperation. I vissa andra DBMS (åtminstone i SQL Server) kan vi ersätta den sista
SELECT *
medDELETE
för att ta bort dubblettraderna från tabellen. Men SQLite låter oss inte uppdatera CTE på det sättet.Lyckligtvis kan de nästa två alternativen ändras för att utföra en radering.
Alternativ 5
Vi kan dra nytta av SQLites
rovid
:VÄLJ * FRÅN PetsWHERE EXISTS (VÄLJ 1 FRÅN Husdjur p2 WHERE Pets.PetName =p2.PetName AND Pets.PetType =p2.PetType AND Pets.rowid> p2. rowid);
Resultat:
PetId PetName PetType----- ------- -------1 Wag Dog 4 Bark Dog 4 Bark DogHur fungerar detta? Som standard har varje rad i SQLite en speciell kolumn, vanligtvis kallad
rovid
, som unikt identifierar den raden i tabellen. Detta kan tas bort om det behövs, men om det inte uttryckligen har tagits bort kommer du att kunna utnyttja det i dina frågor.Alternativ 6
Och slutligen, här är ett annat alternativ som använder SQLites
rowid
:VÄLJ * FRÅN PetsWHERE rowid> (VÄLJ MIN(rovid) FRÅN Husdjur p2 WHERE Pets.PetName =p2.PetName AND Pets.PetType =p2.PetType);
Resultat:
PetId PetName PetType----- ------- -------1 Wag Dog 4 Bark Dog 4 Bark Dog