Usa el 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 )
Por supuesto, podrías hacer a.rowid < b.rowid también. El rowid es solo la dirección física de la fila, por lo que no importa si elimina la fila que tiene la dirección más grande o más pequeña.
Sin embargo, los resultados esperados no tienen sentido.
Expected Result :
ROWNUM ID NAME
---------- ---------- ----------
4 1 leo_1
5 2 leo_2
6 3 leo_3
El rownum de un conjunto de resultados siempre se asigna en el momento de la consulta. Eso significa que una fila en particular puede aparecer con diferentes rownum valores en diferentes consultas (o cuando la misma consulta se ejecuta varias veces). rownum siempre es secuencial, por lo que nunca puede tener un rownum de 4 en un conjunto de resultados sin tener también rownum valores de 1, 2 y 3 en el mismo conjunto de resultados. Cualquier fila duplicada que elimine, su resultado será
Resultado esperado:
ROWNUM ID NAME
---------- ---------- ----------
1 1 leo_1
2 2 leo_2
3 3 leo_3
Pero el rownum Los valores son arbitrarios. Sería igual de válido que volviera Oracle
Resultado esperado:
ROWNUM ID NAME
---------- ---------- ----------
1 2 leo_2
2 3 leo_3
3 1 leo_1