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