Oracle
 sql >> Database >  >> RDS >> Oracle

Elimina i record duplicati utilizzando rownum in sql

Usa il 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 )

Certo, potresti fare a.rowid < b.rowid anche. Il rowid è solo l'indirizzo fisico della riga, quindi non importa se elimini la riga con l'indirizzo più grande o quello più piccolo.

I risultati attesi, tuttavia, non hanno senso.

Expected Result :

        ROWNUM         ID NAME
    ---------- ---------- ----------
             4          1 leo_1
             5          2 leo_2
             6          3 leo_3

Il rownum di un set di risultati viene sempre assegnato al momento della query. Ciò significa che una riga particolare potrebbe apparire con rownum diverso valori in query diverse (o quando la stessa query viene eseguita più volte). rownum è sempre sequenziale, quindi non puoi mai avere un rownum di 4 in un set di risultati senza avere anche rownum valori di 1, 2 e 3 nello stesso set di risultati. Qualunque riga duplicata elimini, il risultato sarà

Risultato previsto :

    ROWNUM         ID NAME
---------- ---------- ----------
         1          1 leo_1
         2          2 leo_2
         3          3 leo_3

Ma il rownum i valori sono arbitrari. Sarebbe altrettanto valido per il ritorno di Oracle

Risultato previsto :

    ROWNUM         ID NAME
---------- ---------- ----------
         1          2 leo_2
         2          3 leo_3
         3          1 leo_1