Oracle
 sql >> Baza danych >  >> RDS >> Oracle

2 sposoby na usunięcie zduplikowanych wierszy w Oracle

Poniższe opcje mogą być użyte do usunięcia zduplikowanych wierszy w bazie danych Oracle.

Te przykłady usuwają zduplikowane wiersze, ale zachowują jeden. Więc jeśli są na przykład trzy identyczne wiersze, usuwa dwa z nich i zachowuje jeden. Jest to często nazywane usuwaniem duplikatów tabeli.

Przykładowe dane

Załóżmy, że mamy tabelę z następującymi danymi:

SELECT * FROM Pets;

Wynik:

PETID	PETNAME	PETTYPE
1	Wag	Dog
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog
4	Bark	Dog
4	Bark	Dog

Widzimy, że pierwsze dwa wiersze są duplikatami, podobnie jak ostatnie trzy wiersze.

W takim przypadku wszystkie kolumny są duplikatami. Brak kolumny klucza podstawowego. Normalnie można by się spodziewać PetId kolumna jest kluczem podstawowym, ale zawiera zduplikowane wartości i dlatego nie może być kluczem podstawowym.

Gdyby był to klucz podstawowy, zawierałby unikalne wartości we wszystkich wierszach i nie byłoby duplikatów.

Niezależnie od tego poniżej znajdują się dwie opcje wyszukiwania i usuwania zduplikowanych wierszy, nawet jeśli nie ma klucza podstawowego.

Opcja 1

Oto jedna opcja usuwania zduplikowanych wierszy z powyższej tabeli:

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;

Wynik:

3 row(s) deleted.

PETID	PETNAME	PETTYPE
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog

Tabela została usunięta. Trzy wiersze zostały usunięte, a cztery pozostały.

Jeden ze zduplikowanych wierszy dla naszego psa „Wag” został usunięty, a drugi pozostał. Usunięto również dwa zduplikowane wiersze dla „Kora”.

rowid Oracle pseudokolumna pozwoliła nam wykonać tę operację deduplikacji. Byliśmy w stanie odnieść się do niego w naszym zapytaniu, aby określić, które wiersze należy usunąć.

Działa to tak, że każdy wiersz w bazie danych Oracle ma rowid pseudokolumna, która zwraca adres wiersza. rowid jest unikalnym identyfikatorem wierszy w tabeli i zwykle jego wartość jednoznacznie identyfikuje wiersz w bazie danych. Dlatego możemy zidentyfikować każdy wiersz, nawet jeśli nie mamy klucza podstawowego lub innego unikalnego pola identyfikatora.

Należy jednak pamiętać, że wiersze w różnych tabelach, które są przechowywane razem w tym samym klastrze, mogą mieć ten sam rowid .

Opcja 2

Zakładając, że tabela została przywrócona z oryginalnymi danymi (w tym zduplikowanymi wierszami), oto kolejna opcja usuwania zduplikowanych wierszy.

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

SELECT * FROM Pets;

Wynik:

PETID	PETNAME	PETTYPE
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog

Taki sam wynik jak w poprzednim przykładzie.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Informacje o elemencie formatu RM w Oracle

  2. Podłączanie Oracle 21c do SQL Server

  3. Hibernate nie mógł pobrać SequenceInformation z bazy danych

  4. Jak przekonwertować liczbę dziesiętną na szesnastkową za pomocą TO_CHAR() w Oracle

  5. Dlaczego PL/SQL nie respektuje uprawnień przyznanych przez role?