Dubletten in Oracle7 löschen?

Ich habe eine Tabelle mit Kunden (z.B.„CLients“).In dieser Tabelle sind viele Kunden doppelt angelegt. Die Tabelle hat eine Spalte mit Kundennummer(z.B.„K_ID“).
Wie kann ich die doppelten Einträge entfernen ohne daß ich mir gleich alle Kunden lösche ?.

Dubletten löschen: Trick mit ROWID
Hallo,

folgender Trick:

DELETE FROM kunden
WHERE rowid NOT IN
 (SELECT MIN (rowid)
 FROM kunden
 GROUP BY k\_id);

Die Subquery sammelt alle Tupel auf, die NICHT gelöscht werden sollen. Dazu wird nach k_id gruppiert und jeweils das Tupel mit der kleinster rowid selektiert. Die Hauptquery löscht alle Tupel, die NICHT in der Subquery vorkommen. Resultat: Alle Dubletten entfernt.

Du definierst Dubletten als Tupel, die die gleiche k_id haben. „Wahre“ Dubletten sind allerdings dadurch definiert, dass sie in allen Attributen übereinstimmen. Auch diesen Fall kann man mit dem gleichen Prinzip lösen, in der GROUP BY clause müssen lediglich alle Attribute aufgeführt werden:

DELETE FROM relation
WHERE rowid NOT IN
 (SELECT MIN (rowid)
 FROM relation
 GROUP BY attr1, attr2, attr3, ...)

Noch ein genereller Hinweis: Bei großen Relationen kann dieses DELETE-Statement ziemlich lange dauern. Da bietet es sich an, zuerst die Subquery auszuführen, die Daten in einer temp. Relation abzulegen, einen Index zu definieren und dann das DELETE-Statement auszuführen:

CREATE TABLE temprelation as
SELECT MIN (rowid) AS minrowid
FROM relation
GROUP BY attr1, attr2, attr3, ...;


CREATE INDEX xtemprelation ON temprelation (minrowid);


DELETE FROM relation
WHERE rowid NOT IN (SELECT minrowid FROM temprelation);


DROP TABLE temprelation;

ciao,
Bernhard