Använd 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 )
Naturligtvis kan du göra a.rowid < b.rowid
också. rowid
är bara den fysiska adressen för raden så det spelar ingen roll om du tar bort raden som har den större eller den mindre adressen.
Dina förväntade resultat är dock inte vettiga.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
rownum
av en resultatuppsättning tilldelas alltid vid frågetillfället. Det betyder att en viss rad kan visas med ett annat rownum
värden i olika frågor (eller när samma fråga körs flera gånger). rownum
är alltid sekventiell så du kan aldrig ha ett rownum
av 4 i en resultatuppsättning utan att även ha rownum
värden 1, 2 och 3 i samma resultatuppsättning. Vilken dubblettrad du än tar bort kommer ditt resultat att bli
Förväntat resultat:
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Men rownum
värden är godtyckliga. Det skulle vara lika giltigt för Oracle att återvända
Förväntat resultat:
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1