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.