Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Excluir registros duplicados usando rownum no sql


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