Usa il 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 )
Certo, potresti fare a.rowid < b.rowid
anche. Il rowid
è solo l'indirizzo fisico della riga, quindi non importa se elimini la riga con l'indirizzo più grande o quello più piccolo.
I risultati attesi, tuttavia, non hanno senso.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
Il rownum
di un set di risultati viene sempre assegnato al momento della query. Ciò significa che una riga particolare potrebbe apparire con rownum
diverso valori in query diverse (o quando la stessa query viene eseguita più volte). rownum
è sempre sequenziale, quindi non puoi mai avere un rownum
di 4 in un set di risultati senza avere anche rownum
valori di 1, 2 e 3 nello stesso set di risultati. Qualunque riga duplicata elimini, il risultato sarà
Risultato previsto :
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Ma il rownum
i valori sono arbitrari. Sarebbe altrettanto valido per il ritorno di Oracle
Risultato previsto :
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1