sql >> Databasteknik >  >> RDS >> Oracle

Ta bort dubbletter av poster med hjälp av rownum i sql

Använd 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 )

Naturligtvis kan du göra a.rowid < b.rowid också. rowid är bara den fysiska adressen för raden så det spelar ingen roll om du tar bort raden som har den större eller den mindre adressen.

Dina förväntade resultat är dock inte vettiga.

Expected Result :

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

rownum av en resultatuppsättning tilldelas alltid vid frågetillfället. Det betyder att en viss rad kan visas med ett annat rownum värden i olika frågor (eller när samma fråga körs flera gånger). rownum är alltid sekventiell så du kan aldrig ha ett rownum av 4 i en resultatuppsättning utan att även ha rownum värden 1, 2 och 3 i samma resultatuppsättning. Vilken dubblettrad du än tar bort kommer ditt resultat att bli

Förväntat resultat:

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

Men rownum värden är godtyckliga. Det skulle vara lika giltigt för Oracle att återvända

Förväntat resultat:

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


  1. PHP - Fatalt fel:Anrop till en medlemsfunktion bind_param()

  2. Är NUMBER och NUMBER(*,0) samma i Oracle?

  3. Hur kontrollerar jag om det offentliga PostgreSQL-schemat finns?

  4. Oracle PL/SQL Trigger körs endast om ändringar görs i data efter 9-5 timmar