sql >> Databasteknik >  >> RDS >> Oracle

2 sätt att ta bort dubbletter av rader i Oracle

Följande alternativ kan användas för att ta bort dubbletter av rader i Oracle Database.

Dessa exempel tar bort dubbletter av rader men behåller en. Så om det till exempel finns tre identiska rader, tar den bort två av dem och behåller en. Detta kallas ofta för att avdupa tabellen.

Exempeldata

Anta att vi har en tabell med följande data:

SELECT * FROM Pets;

Resultat:

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

Vi kan se att de två första raderna är dubbletter, liksom de tre sista raderna.

I det här fallet är alla kolumner dubbletter. Det finns ingen primärnyckelkolumn. Normalt kan man förvänta sig PetId kolumn vara en primärnyckel, men den innehåller dubbletter av värden och kan därför inte vara en primärnyckel.

Om det var en primärnyckel skulle den innehålla unika värden över alla rader, och det skulle inte finnas några dubbletter.

Oavsett vilket, nedan finns två alternativ för att hitta och ta bort dubbletter av rader även när det inte finns någon primärnyckel.

Alternativ 1

Här är ett alternativ för att ta bort dubbletter av rader från tabellen ovan:

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;

Resultat:

3 row(s) deleted.

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

Bordet har nu avduperats. Tre rader raderades och fyra finns kvar.

En av dubblettraderna för vår hund "Wag" har raderats och den andra finns kvar. Två av dubblettraderna för "Bark" har också tagits bort.

Oracles rowid pseudokolumnen tillät oss att utföra denna de-dupe-operation. Vi kunde referera till det i vår fråga för att avgöra vilka rader som skulle raderas.

Så här fungerar det är att varje rad i en Oracle-databas har en rowid pseudokolumn som returnerar adressen till raden. rowid är en unik identifierare för rader i tabellen, och vanligtvis identifierar dess värde unikt en rad i databasen. Därför kan vi identifiera varje rad även när vi inte har en primärnyckel eller något annat unikt ID-fält.

Det är dock viktigt att notera att rader i olika tabeller som är lagrade tillsammans i samma kluster kan ha samma rowid .

Alternativ 2

Förutsatt att tabellen har återställts med dess ursprungliga data (inklusive dubblettrader), här är ett annat alternativ för att ta bort dubblettrader.

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

SELECT * FROM Pets;

Resultat:

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

Samma resultat som föregående exempel.


  1. mysql_num_rows() förväntar sig att parameter 1 är resurs, boolean ges in

  2. MySQL tidszoner

  3. Fel vid installation av psycopg2==2.6.2

  4. Hur man förbättrar MySQL AWS-prestanda 2X över Amazon RDS till samma kostnad