sql >> Databáze >  >> RDS >> Oracle

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

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.


  1. Suma s SQL server RollUP - ale jen poslední shrnutí?

  2. Ladění výkonu PL/SQL pro dotazy typu LIKE '%...%' se zástupnými znaky

  3. Jaký je rozdíl mezi `->>` a `->` v Postgres SQL?

  4. Připojení AnySQL Maestro k Salesforce.com