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

重複するレコードはOracleデータベースを削除する必要があります

    行は、IDと作成タイムスタンプを除いて同一です。重複を見つけるには、他のすべての列を比較する必要があります:

    別のID(t2.id <> t1.id)を持つ重複を探すことによって両方の行を見つけるクエリ。 ):

    select *
    from hourly_report_table t1
    where exists
    (
      select *
      from hourly_report_table t2
      where t2.id <> t1.id
      and t2.application = t1.application
      and t2.api_date = t1.api_date
      and t2.api_hour = t1.api_hour
      and ...
    );
    

    t2.id < t1.idを比較することにより、重複グループの1行のみを保持するdeleteステートメント :

    delete
    from hourly_report_table t1
    where exists
    (
      select *
      from hourly_report_table t2
      where t2.id < t1.id
      and t2.application = t1.application
      and t2.api_date = t1.api_date
      and t2.api_hour = t1.api_hour
      and ...
    );
    

    これを特定の日時に制限する場合は、そうしてください。

    where exists (...) and api_date = date '2020-09-27' and api_hour = 17
    

    したがって、テーブルの一部のみを処理しますが、DBMSがこのデータをすばやく見つけることができることを確認する必要があります(ホールテーブルを何度も読み取る必要はありません)。このためのインデックスを提供します:

    create index idx1 on hourly_report_table (api_date, api_hour);
    



    1. 結果がない場合に数値「ゼロ」を返すMySQLクエリ

    2. SQL Server 2008で多くの行を1つの文字列に連結するにはどうすればよいですか?

    3. ケースステートメントによるグループ化

    4. Mysqlサーバーは4バイトでエンコードされたutf8文字をサポートしていません