Následující možnosti lze použít k odstranění duplicitních řádků v databázi Oracle.
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ý sloupec primárního klíče. Normálně lze očekávat PetId
jako primární klíč, ale obsahuje duplicitní hodnoty, a proto nemůže být primárním klíčem.
Pokud by se jednalo o primární klíč, obsahoval by jedinečné hodnoty ve všech řádcích a neexistovaly by žádné duplikáty.
Bez ohledu na to jsou níže dvě možnosti, jak najít a odstranit duplicitní řádky, i když neexistuje primární klíč.
Možnost 1
Zde je jedna možnost pro odstranění duplicitních řádků z výše uvedené tabulky:
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:
3 row(s) deleted. PETID PETNAME PETTYPE 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Bark Dog
Tabulka je nyní zbavena duplicit. Tři řádky byly odstraněny a čtyři zůstaly.
Jeden z duplicitních řádků pro našeho psa „Wag“ byl smazán a druhý zůstává. Dva z duplicitních řádků pro „Kůra“ byly také odstraněny.
rowid
společnosti Oracle pseudosloupec nám umožnil provést tuto operaci odstranění duplicit. Dokázali jsme na něj odkazovat v našem dotazu, abychom určili, které řádky se mají odstranit.
Funguje to tak, že každý řádek v databázi Oracle má rowid
pseudosloupec, který vrací adresu řádku. rowid
je jedinečný identifikátor pro řádky v tabulce a obvykle jeho hodnota jednoznačně identifikuje řádek v databázi. Proto můžeme identifikovat každý řádek, i když nemáme primární klíč nebo jiné jedinečné pole ID.
Je však důležité si uvědomit, že řádky v různých tabulkách, které jsou uloženy společně ve stejném clusteru, mohou mít stejný rowid
.
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 duplicitní řádky smazat.
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
Stejný výsledek jako v předchozím příkladu.