Følgende muligheder kan bruges til at slette dublerede rækker i SQLite.
Disse eksempler sletter duplikerede rækker, men beholder én. Så hvis der for eksempel er tre identiske rækker, sletter den to af dem og beholder en. Dette omtales ofte som de-duping af bordet.
Eksempeldata
Antag, at vi har en tabel med følgende data:
SELECT * FROM Pets;
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
Vi kan se, at de første to rækker er dubletter, ligesom de sidste tre rækker.
I dette tilfælde er alle kolonner dubletter. Der er ingen primær nøgle. PetId
kolonne se ud ligesom det kunne være en primær nøgle, men den indeholder faktisk duplikerede værdier. Derfor er det ikke en unik identifikator for hver række, og den kan ikke bruges som en primær nøgle.
Hvis der var en primær nøgle, ville den indeholde unikke værdier på tværs af alle rækker, og der ville ikke være nogen dubletter.
Under alle omstændigheder er der to muligheder for at finde og slette duplikerede rækker.
Valgmulighed 1
Før vi de-duperer tabellen, kan vi bruge følgende forespørgsel til at se, hvilke rækker der vil blive slettet:
SELECT * FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets 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 Dog
Dette viser os, at tre rækker vil blive slettet, når vi de-duperer tabellen i næste trin.
For at slette de duplikerede værdier kan vi ændre ovenstående forespørgsel ved at erstatte SELECT *
med DELETE
:
DELETE FROM Pets
WHERE EXISTS (
SELECT 1 FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
AND Pets.rowid > p2.rowid
);
SELECT * FROM Pets;
Resultat:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Tabellen er nu blevet de-duperet.
Som forventet er en af duplikatrækkerne for vores hund "Wag" blevet slettet, og den anden forbliver. To af dubletrækkerne for "Bark" er også blevet slettet.
Grunden til, at vi var i stand til at gøre dette, er på grund af SQLites rowid
. Som standard har hver række i SQLite en speciel kolonne, normalt kaldet rowid
, der entydigt identificerer den pågældende række i tabellen. Medmindre det eksplicit er blevet fjernet fra tabellen, kan du bruge dette som en unik identifikator for hver række, hvilket gør det muligt for os at konstruere ovenstående forespørgsler. Det samme gælder for det næste eksempel.
Valgmulighed 2
Forudsat at tabellen er blevet gendannet med dens originale data (inklusive duplikerede rækker), er her en anden mulighed for at de-dupere den.
Tjek hvilke rækker der slettes:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Resultat:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Slet nu disse rækker:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Resultat:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Bordet er blevet de-duperet.