Poniższe opcje mogą być użyte do usunięcia zduplikowanych wierszy w SQLite.
Te przykłady usuwają zduplikowane wiersze, ale zachowują jeden. Więc jeśli są na przykład trzy identyczne wiersze, usuwa dwa z nich i zachowuje jeden. Jest to często nazywane usuwaniem duplikatów tabeli.
Przykładowe dane
Załóżmy, że mamy tabelę z następującymi danymi:
SELECT * FROM Pets;
Wynik:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog 4 Bark Dog 4 Bark Dog
Widzimy, że pierwsze dwa wiersze są duplikatami, podobnie jak ostatnie trzy wiersze.
W takim przypadku wszystkie kolumny są duplikatami. Nie ma klucza podstawowego. PetId
kolumna może wyglądać może to być klucz podstawowy, ale w rzeczywistości zawiera zduplikowane wartości. Dlatego nie jest to unikalny identyfikator dla każdego wiersza i nie może być używany jako klucz podstawowy.
Gdyby istniał klucz podstawowy, zawierałby unikalne wartości we wszystkich wierszach i nie byłoby duplikatów.
W każdym razie poniżej znajdują się dwie opcje wyszukiwania i usuwania zduplikowanych wierszy.
Opcja 1
Zanim usuniemy duplikat tabeli, możemy użyć następującego zapytania, aby zobaczyć, które wiersze zostaną usunięte:
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
);
Wynik:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
To pokazuje nam, że podczas usuwania duplikatów tabeli w następnym kroku zostaną usunięte trzy wiersze.
Aby usunąć zduplikowane wartości, możemy zmodyfikować powyższe zapytanie, zastępując SELECT *
z 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;
Wynik:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Tabela została usunięta z kopii.
Zgodnie z oczekiwaniami, jeden ze zduplikowanych wierszy dla naszego psa „Wag” został usunięty, a drugi pozostał. Usunięto również dwa zduplikowane wiersze dla „Kora”.
Powodem, dla którego udało nam się to zrobić, jest rowid
SQLite . Domyślnie każdy wiersz w SQLite ma specjalną kolumnę, zwykle nazywaną rowid
, który jednoznacznie identyfikuje ten wiersz w tabeli. O ile nie został on wyraźnie usunięty z tabeli, możesz użyć go jako unikalnego identyfikatora dla każdego wiersza, co umożliwi nam skonstruowanie powyższych zapytań. To samo dotyczy następnego przykładu.
Opcja 2
Zakładając, że tabela została przywrócona z oryginalnymi danymi (w tym zduplikowanymi wierszami), oto kolejna opcja jej usunięcia.
Sprawdź, które wiersze zostaną usunięte:
SELECT * FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
Wynik:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 4 Bark Dog 4 Bark Dog
Teraz usuń te wiersze:
DELETE FROM Pets
WHERE rowid > (
SELECT MIN(rowid) FROM Pets p2
WHERE Pets.PetName = p2.PetName
AND Pets.PetType = p2.PetType
);
SELECT * FROM Pets;
Wynik:
PetId PetName PetType ----- ------- ------- 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Tabela została zdeduplikowana.