sql >> Database >  >> RDS >> Oracle

Verwijder dubbele records met rownum in sql

Gebruik de 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 )

Natuurlijk kunt u a.rowid < b.rowid . doen ook. De rowid is alleen het fysieke adres van de rij, dus het maakt niet uit of u de rij met het grotere of het kleinere adres verwijdert.

Je verwachte resultaten kloppen echter niet.

Expected Result :

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

Het rownum van een resultatenset wordt altijd toegewezen op het moment van de query. Dat betekent dat een bepaalde rij kan verschijnen met een ander rownum waarden in verschillende query's (of wanneer dezelfde query meerdere keren wordt uitgevoerd). rownum is altijd opeenvolgend, dus je kunt nooit een rownum . hebben van 4 in een resultatenset zonder ook rownum . te hebben waarden van 1, 2 en 3 in dezelfde resultaatset. Welke dubbele rij u ook verwijdert, uw resultaat is

Verwacht resultaat:

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

Maar de rownum waarden zijn willekeurig. Het zou net zo geldig zijn als Oracle zou terugkeren

Verwacht resultaat:

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


  1. Hibernate buitenaardse vragen naar de database sturen

  2. PostgreSQL-tekst/bytea-kolom migreren naar een groot object?

  3. Communicatieverbindingsfout, Spring Boot + MySql + Docker + Hibernate

  4. MySQL JOIN-prestaties op 1 grote tafel en meerdere kleine tafels