Oracle
 sql >> Base de données >  >> RDS >> Oracle

Supprimer les enregistrements en double à l'aide de rownum dans sql

Utilisez le 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 )

Bien sûr, vous pouvez faire a.rowid < b.rowid aussi bien. Le rowid est juste l'adresse physique de la ligne donc peu importe que vous supprimiez la ligne qui a la plus grande ou la plus petite adresse.

Vos résultats attendus, cependant, n'ont aucun sens.

Expected Result :

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

Le rownum d'un ensemble de résultats est toujours affecté au moment de la requête. Cela signifie qu'une ligne particulière peut apparaître avec différents rownum valeurs dans différentes requêtes (ou lorsque la même requête est exécutée plusieurs fois). rownum est toujours séquentiel donc vous ne pouvez jamais avoir un rownum de 4 dans un jeu de résultats sans avoir également rownum valeurs de 1, 2 et 3 dans le même jeu de résultats. Quelle que soit la ligne en double que vous supprimez, votre résultat sera

Résultat attendu :

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

Mais le rownum les valeurs sont arbitraires. Il serait tout aussi valable pour Oracle de retourner

Résultat attendu :

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