Use o
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 )
Claro, você pode fazer
a.rowid < b.rowid
também. O rowid
é apenas o endereço físico da linha, portanto, não importa se você exclui a linha que tem o endereço maior ou menor. Seus resultados esperados, porém, não fazem sentido.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
O
rownum
de um conjunto de resultados é sempre atribuído no momento da consulta. Isso significa que uma linha específica pode aparecer com diferentes rownum
valores em consultas diferentes (ou quando a mesma consulta é executada várias vezes). rownum
é sempre sequencial, então você nunca pode ter um rownum
de 4 em um conjunto de resultados sem também ter rownum
valores de 1, 2 e 3 no mesmo conjunto de resultados. Qualquer que seja a linha duplicada que você excluir, seu resultado será Resultado esperado :
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Mas o
rownum
os valores são arbitrários. Seria igualmente válido para a Oracle retornar Resultado esperado :
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1