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.