Gebruik de 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 )
Natuurlijk kunt u a.rowid < b.rowid . doen ook. De rowid is alleen het fysieke adres van de rij, dus het maakt niet uit of u de rij met het grotere of het kleinere adres verwijdert.
Je verwachte resultaten kloppen echter niet.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
Het rownum van een resultatenset wordt altijd toegewezen op het moment van de query. Dat betekent dat een bepaalde rij kan verschijnen met een ander rownum waarden in verschillende query's (of wanneer dezelfde query meerdere keren wordt uitgevoerd). rownum is altijd opeenvolgend, dus je kunt nooit een rownum . hebben van 4 in een resultatenset zonder ook rownum . te hebben waarden van 1, 2 en 3 in dezelfde resultaatset. Welke dubbele rij u ook verwijdert, uw resultaat is
Verwacht resultaat:
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Maar de rownum waarden zijn willekeurig. Het zou net zo geldig zijn als Oracle zou terugkeren
Verwacht resultaat:
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1