sql >> Databáze >  >> RDS >> SQLite

2 způsoby, jak odstranit duplicitní řádky v SQLite

Následující možnosti lze použít k odstranění duplicitních řádků v SQLite.

Tyto příklady odstraní duplicitní řádky, ale ponechají jeden. Pokud tedy existují například tři stejné řádky, dva z nich smaže a jeden ponechá. To se často nazývá deduping tabulky.

Ukázková data

Předpokládejme, že máme tabulku s následujícími údaji:

SELECT * FROM Pets;

Výsledek:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     Dog    
4      Bark     Dog    
4      Bark     Dog    

Vidíme, že první dva řádky jsou duplikáty, stejně jako poslední tři řádky.

V tomto případě jsou všechny sloupce duplicitní. Neexistuje žádný primární klíč. PetId sloupec může vypadat jako by to mohl být primární klíč, ale ve skutečnosti obsahuje duplicitní hodnoty. Nejde tedy o jedinečný identifikátor pro každý řádek a nelze jej použít jako primární klíč.

Pokud by existoval primární klíč, obsahoval by jedinečné hodnoty ve všech řádcích a neexistovaly by žádné duplikáty.

V každém případě níže jsou dvě možnosti, jak najít a odstranit duplicitní řádky.

Možnost 1

Před odstraněním duplicit v tabulce můžeme použít následující dotaz, abychom zjistili, které řádky budou odstraněny:

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
);

Výsledek:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
4      Bark     Dog    
4      Bark     Dog    

To nám ukazuje, že při odstranění duplicit v tabulce v dalším kroku budou odstraněny tři řádky.

Chcete-li odstranit duplicitní hodnoty, můžeme upravit výše uvedený dotaz nahrazením SELECT * pomocí 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;

Výsledek:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     Dog    

Tabulka byla nyní deduplikována.

Podle očekávání byl jeden z duplicitních řádků pro našeho psa „Wag“ smazán a druhý zůstává. Dva z duplicitních řádků pro „Kůra“ byly také odstraněny.

Důvodem, proč jsme to mohli udělat, je rowid SQLite . Ve výchozím nastavení má každý řádek v SQLite speciální sloupec, který se obvykle nazývá rowid , který jednoznačně identifikuje daný řádek v tabulce. Pokud nebyl explicitně odstraněn z tabulky, můžete jej použít jako jedinečný identifikátor pro každý řádek, což nám umožňuje sestavit výše uvedené dotazy. Totéž platí pro následující příklad.

Možnost 2

Za předpokladu, že tabulka byla obnovena s původními daty (včetně duplicitních řádků), je zde další možnost, jak ji odstranit.

Zkontrolujte, které řádky budou smazány:

SELECT * FROM Pets
WHERE rowid > (
  SELECT MIN(rowid) FROM Pets p2  
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
);

Výsledek:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
4      Bark     Dog    
4      Bark     Dog    

Nyní odstraňte tyto řádky:

DELETE FROM Pets
WHERE rowid > (
  SELECT MIN(rowid) FROM Pets p2  
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
);

SELECT * FROM Pets;

Výsledek:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     Dog    

Tabulka byla deduplikována.


  1. Nelze použít tabulku s názvem user v postgresql hibernaci

  2. Základy tabulkových výrazů, 4. část – Odvozené tabulky, optimalizační úvahy, pokračování

  3. Co je prohlížeč SQLite a jak jej používat?

  4. Jak filtrovat řádky bez NULL ve sloupci