Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Löschen Sie doppelte Datensätze mit Rownum in SQL

Verwenden Sie die 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 )

Natürlich könnten Sie a.rowid < b.rowid verwenden auch. Die rowid ist nur die physische Adresse der Zeile, also spielt es keine Rolle, ob Sie die Zeile mit der größeren oder der kleineren Adresse löschen.

Ihre erwarteten Ergebnisse ergeben jedoch keinen Sinn.

Expected Result :

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

Die rownum einer Ergebnismenge wird immer zur Abfragezeit zugewiesen. Das bedeutet, dass eine bestimmte Zeile mit einer anderen rownum erscheinen kann Werte in verschiedenen Abfragen (oder wenn dieselbe Abfrage mehrmals ausgeführt wird). rownum ist immer sequentiell, sodass Sie niemals eine rownum haben können von 4 in einer Ergebnismenge, ohne auch rownum zu haben Werte von 1, 2 und 3 in derselben Ergebnismenge. Unabhängig davon, welche doppelte Zeile Sie löschen, lautet Ihr Ergebnis

Erwartetes Ergebnis :

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

Aber die rownum Werte sind willkürlich. Es wäre für Oracle genauso gültig, zurückzukehren

Erwartetes Ergebnis :

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