Použijte 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 )
Samozřejmě můžete udělat a.rowid < b.rowid
také. rowid
je pouze fyzická adresa řádku, takže nezáleží na tom, zda smažete řádek, který má větší nebo menší adresu.
Vaše očekávané výsledky však nedávají smysl.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
rownum
sady výsledků je vždy přiřazena v době dotazu. To znamená, že konkrétní řádek se může objevit s jiným rownum
hodnoty v různých dotazech (nebo když je stejný dotaz spuštěn vícekrát). rownum
je vždy sekvenční, takže nikdy nemůžete mít rownum
ze 4 v sadě výsledků, aniž by měl také rownum
hodnoty 1, 2 a 3 ve stejné sadě výsledků. Ať smažete kterýkoli duplicitní řádek, váš výsledek bude
Očekávaný výsledek:
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Ale rownum
hodnoty jsou libovolné. Pro Oracle by bylo stejně platné vrátit se
Očekávaný výsledek:
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1