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

Oracleから重複行を削除する

    データベースにはさまざまな理由があるため、Oracleテーブルから重複する行を見つけて削除する必要があることがよくあります。データの問題を頻繁に解消するには、削除する必要があります。重複する行をOracleで削除する方法はたくさんありますが、元の行を保持します。この投稿では、それを実現するためのより高速な方法をいくつか紹介します。 rowidを使用する方法と使用しない方法を示します。テーブル内で行を複製するすべての列を特定し、SQLの適切な削除ステートメントでそれらすべての列を指定する必要があることに注意してください

    Oracleから重複行を削除する方法

    重複する行を簡単に削除する方法のいくつかを次に示します

    (A)高速な方法ですが、すべてのOracleインデックス、トリガーを再作成する必要があります

    create table my_table1 as select distinct * from my_table;
    drop my_table;
    rename my_table1 to my_table;

    SQL> select * from mytest;
    ID NAME
    ------
    1 TST 
    2 TST 
    1 TST
    
    SQL> create table mytest1 as select distinct * from mytest;
    Table created.
    
    SQL> select * from mytest1;
    ID NAME
    -------
    2 TST 
    1 TST
    SQL> drop table mytest;
    Table dropped.
    SQL> rename mytest1 to mytest;
    Table renamed.
    SQL> select * from mytest;
    ID NAME
    -------
    2 TST
    1 TST

    (B)ROWIDを使用してOracleで重複レコードを検索および削除する方法。次の例は1つの列を示しています。2つの列に基づいて削除する場合は、2つの列を指定できます

    Delete from my_table where rowid not in (
    select max(rowid) from my_table group by my_col_name );

    (C)oracleself-joinを使用して重複する行を削除します

    DELETE FROM my_table A WHERE ROWID > (SELECT min(rowid) FROM my_table B WHERE A.key_values = B.key_values);

    (D)exists句を使用する

    delete from my_table t1
    where exists (select 'x' from my_table t2
    where t2.key_value1 = t1.key_value1
    and t2.key_value2 = t1.key_value2
    and t2.rowid > t1.rowid);

    (E)Oracle分析関数を使用して重複レコードを削除する

    delete from my_table
    where rowid in
    (select rid
    from
    ( select
    rowid rid,
    row_number() over (partition by column_name order by rowid) rn
    from my_table)
    where rn <> 1
    )

    示されているように、テーブル内の重複する行を削除する方法はたくさんあります。これらのコマンドは多くの状況で便利であり、要件に応じて使用できます。ステートメントを実行する前に、必ずバックアップが利用可能であることを確認してください。また、最初にクエリを使用して重複を見つけ、コミットする前に確認する必要があります

    rowidを使用してOracleで重複レコードを見つける方法

    select * from my_table
    where rowid not in
    (select max(rowid) from my_table group by column_name);

    したがって、最初に上記のクエリを使用して重複を検索し、次にそれを削除すると、削除数は上記のクエリの行数と同じになります。次に、重複検索クエリを再度実行します。重複がない場合は、コミットできます

    以下の記事を参照して、SQLを詳しく調べてください

    Oracle Sqlチュートリアル:すべての有用なOraclesql記事のリストが含まれています。 OracleSqlを知っている場合でもOracleSqlについて学ぶためにそれらを探索してください
    Oracleインタビューの質問:トップ49のOracleインタビューの質問と回答についてはこのページをチェックしてください:基本、インタビューに役立つOracleSQL。追加資料も提供されています
    oracleのwhere句:データセットの制限、where句、sqlステートメントのwhere句、比較演算子の
    Oracleの単一行関数:これをチェックして、sql、Oracleデータの単一行関数を確認してください関数、SQLの数値関数、SQLの文字関数
    oraclesqlクエリ
    blog.oracle.com


    1. MariaDBで小文字を含む行を見つける4つの方法

    2. テーブルの設計中に1対1、1対多、および多対多の関係を実装するにはどうすればよいですか?

    3. MySQL:テーブルにレコードが存在しない場合はレコードを挿入します

    4. テーブルの列を削除する方法