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.