sql >> データベース >  >> RDS >> Oracle

SQLでrownumを使用して重複レコードを削除する

    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 )
    

    もちろん、a.rowid < b.rowidを実行することもできます。 同じように。 rowid は行の物理アドレスにすぎないため、アドレスが大きい行と小さい行のどちらを削除してもかまいません。

    ただし、期待する結果は意味がありません。

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

    rownum 結果セットのは、常にクエリ時に割り当てられます。つまり、特定の行が異なるrownumで表示される可能性があります 異なるクエリの値(または同じクエリが複数回実行された場合)。 rownum は常にシーケンシャルであるため、rownumを持つことはできません。 rownumも含まない結果セットの4 同じ結果セットの1、2、および3の値。どちらの重複行を削除しても、結果は次のようになります

    期待される結果:

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

    しかし、rownum 値は任意です。 Oracleが戻ることも同様に有効です

    期待される結果:

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


    1. sqliteのstrftimeはpostgresに変換します

    2. MAMPPromysqlを起動できません

    3. C#のストアドプロシージャから戻り値を取得する

    4. SQLServerでTopをTiesで使用する方法-SQLServer/TSQLチュートリアルパート114