sql >> Base de Datos >  >> RDS >> Oracle

Eliminar registros duplicados usando rownum en sql

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