sql >> Databasteknik >  >> RDS >> SQLite

2 sätt att ta bort dubbletter av rader i SQLite

Följande alternativ kan användas för att ta bort dubbletter av rader i SQLite.

Dessa exempel tar bort dubbletter av rader men behåller en. Så om det finns tre identiska rader till exempel, tar den bort två av dem och behåller en. Detta kallas ofta för att avdupa tabellen.

Exempeldata

Anta att vi har en tabell med följande 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 att de två första raderna är dubbletter, liksom de tre sista raderna.

I det här fallet är alla kolumner dubbletter. Det finns ingen primärnyckel. PetId kolumnen kan se ut som om det kan vara en primärnyckel, men den innehåller faktiskt dubbletter av värden. Därför är det inte en unik identifierare för varje rad, och den kan inte användas som en primärnyckel.

Om det fanns en primärnyckel skulle den innehålla unika värden över alla rader, och det skulle inte finnas några dubbletter.

Hur som helst, nedan finns två alternativ för att hitta och ta bort dubbletter av rader.

Alternativ 1

Innan vi de-duperar tabellen kan vi använda följande fråga för att se vilka rader som kommer att raderas:

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    

Detta visar oss att tre rader kommer att raderas när vi de-duperar tabellen i nästa steg.

För att ta bort dubblettvärdena kan vi ändra ovanstående fråga genom att ersätta 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 har nu avduperats.

Som väntat har en av dubblettraderna för vår hund "Wag" raderats och den andra finns kvar. Två av dubblettraderna för "Bark" har också tagits bort.

Anledningen till att vi kunde göra detta är på grund av SQLites rowid . Som standard har varje rad i SQLite en speciell kolumn, vanligtvis kallad rowid , som unikt identifierar den raden i tabellen. Om den inte uttryckligen har tagits bort från tabellen kan du använda den som en unik identifierare för varje rad, vilket gör att vi kan konstruera ovanstående frågor. Detsamma gäller för nästa exempel.

Alternativ 2

Förutsatt att tabellen har återställts med dess ursprungliga data (inklusive dubbletter av rader), här är ett annat alternativ för att de-dupera den.

Kontrollera vilka rader som kommer att raderas:

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    

Ta nu bort dessa rader:

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    

Tabellen har avduperats.


  1. Hur testar man metoder som hanterar SQLite-databas i Android?

  2. YEARWEEK() Exempel – MySQL

  3. Välj alla kolumner utom en i MySQL?

  4. URL-strängformat för att ansluta till Oracle-databas med JDBC