SQLite
 sql >> Baza danych >  >> RDS >> SQLite

2 sposoby na usunięcie zduplikowanych wierszy w SQLite

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sqliteLog 14:nie można otworzyć pliku w wierszu

  2. Przechowuj nową pozycję elementów RecyclerView w SQLite po przeciągnięciu i upuszczeniu

  3. Utwórz tabelę za pomocą datownika

  4. Jak formatować liczby z wiodącymi zerami w SQLite

  5. Znajdź naruszenia kluczy obcych w SQLite