Oracle
 sql >> Datenbank >  >> RDS >> Oracle

2 Möglichkeiten zum Löschen doppelter Zeilen in Oracle

Die folgenden Optionen können verwendet werden, um doppelte Zeilen in der Oracle-Datenbank zu löschen.

Diese Beispiele löschen doppelte Zeilen, behalten aber eine bei. Wenn also beispielsweise drei identische Zeilen vorhanden sind, werden zwei davon gelöscht und eine beibehalten. Dies wird oft als Deduplizierung der Tabelle bezeichnet.

Beispieldaten

Angenommen, wir haben eine Tabelle mit den folgenden Daten:

SELECT * FROM Pets;

Ergebnis:

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

Wir können sehen, dass die ersten beiden Zeilen Duplikate sind, ebenso wie die letzten drei Zeilen.

In diesem Fall sind alle Spalten Duplikate. Es gibt keine Primärschlüsselspalte. Normalerweise würde man die PetId erwarten Spalte als Primärschlüssel, enthält aber doppelte Werte und kann daher kein Primärschlüssel sein.

Wenn es sich um einen Primärschlüssel handeln würde, würde er in allen Zeilen eindeutige Werte enthalten, und es gäbe keine Duplikate.

Unabhängig davon finden Sie unten zwei Optionen zum Suchen und Löschen doppelter Zeilen, auch wenn kein Primärschlüssel vorhanden ist.

Option 1

Hier ist eine Option zum Entfernen doppelter Zeilen aus der obigen Tabelle:

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;

Ergebnis:

3 row(s) deleted.

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

Die Tabelle wurde nun dedupliziert. Drei Zeilen wurden gelöscht und vier verbleiben.

Eine der doppelten Zeilen für unseren Hund „Wag“ wurde gelöscht und die andere bleibt bestehen. Zwei der doppelten Zeilen für „Bark“ wurden ebenfalls gelöscht.

Oracles rowid Pseudocolumn ermöglichte es uns, diese Deduplizierungsoperation durchzuführen. Wir konnten in unserer Abfrage darauf verweisen, um zu bestimmen, welche Zeilen gelöscht werden sollten.

Das funktioniert so, dass jede Zeile in einer Oracle-Datenbank eine rowid hat Pseudospalte, die die Adresse der Zeile zurückgibt. Die rowid ist ein eindeutiger Bezeichner für Zeilen in der Tabelle, und normalerweise identifiziert sein Wert eine Zeile in der Datenbank eindeutig. Daher können wir jede Zeile identifizieren, auch wenn wir keinen Primärschlüssel oder ein anderes eindeutiges ID-Feld haben.

Beachten Sie jedoch, dass Zeilen in verschiedenen Tabellen, die zusammen im selben Cluster gespeichert sind, dieselbe rowid haben können .

Option 2

Unter der Annahme, dass die Tabelle mit ihren ursprünglichen Daten (einschließlich doppelter Zeilen) wiederhergestellt wurde, ist hier eine weitere Option zum Löschen doppelter Zeilen.

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

SELECT * FROM Pets;

Ergebnis:

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

Gleiches Ergebnis wie im vorherigen Beispiel.