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

Slet dublerede poster ved hjælp af rownum i sql

Brug 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 )

Selvfølgelig kunne du gøre a.rowid < b.rowid såvel. rowid er kun den fysiske adresse på rækken, så det er ligegyldigt, om du sletter rækken, der har den større eller den mindre adresse.

Dine forventede resultater giver dog ikke mening.

Expected Result :

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

rownum af et resultatsæt tildeles altid på forespørgselstidspunktet. Det betyder, at en bestemt række kan vises med et andet rownum værdier i forskellige forespørgsler (eller når den samme forespørgsel køres flere gange). rownum er altid sekventiel, så du kan aldrig have et rownum af 4 i et resultatsæt uden også at have rownum værdier på 1, 2 og 3 i samme resultatsæt. Uanset hvilken dubletrække du sletter, vil dit resultat være

Forventet resultat:

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

Men rownum værdier er vilkårlige. Det ville være lige så gyldigt for Oracle at vende tilbage

Forventet resultat:

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


  1. MySQL Spørgsmål om planlægning

  2. Oracle SQL:Eksporter til CSV for at undgå nye linjer

  3. JPA-forespørgsel i flere tabeller med mange-til-mange-relation

  4. Grundlæggende versionskontrol til MySQL-tabel