Verwenden Sie die rowid
DELETE FROM table_name a
WHERE EXISTS( SELECT 1
FROM table_name b
WHERE a.id = b.id
AND a.name = b.name
AND a.rowid > b.rowid )
Natürlich könnten Sie a.rowid < b.rowid
verwenden auch. Die rowid
ist nur die physische Adresse der Zeile, also spielt es keine Rolle, ob Sie die Zeile mit der größeren oder der kleineren Adresse löschen.
Ihre erwarteten Ergebnisse ergeben jedoch keinen Sinn.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
Die rownum
einer Ergebnismenge wird immer zur Abfragezeit zugewiesen. Das bedeutet, dass eine bestimmte Zeile mit einer anderen rownum
erscheinen kann Werte in verschiedenen Abfragen (oder wenn dieselbe Abfrage mehrmals ausgeführt wird). rownum
ist immer sequentiell, sodass Sie niemals eine rownum
haben können von 4 in einer Ergebnismenge, ohne auch rownum
zu haben Werte von 1, 2 und 3 in derselben Ergebnismenge. Unabhängig davon, welche doppelte Zeile Sie löschen, lautet Ihr Ergebnis
Erwartetes Ergebnis :
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Aber die rownum
Werte sind willkürlich. Es wäre für Oracle genauso gültig, zurückzukehren
Erwartetes Ergebnis :
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1