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