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