かなめのロジック

フリーSEの雑記ブログ。ORACLEやPostgreSQL、情報セキュリティ、金融について主に書いています。

重複レコードの削除方法

time 2016/01/28

重複レコードの削除方法

ORACLEにおいて、データに重複があり内1レコードを残して他の重複レコードを削除するにはどのようにすればよいのか、重複データの確認方法と削除の方法をまとめました。

sponsored link

重複データの確認

削除の前に、まずは重複データの確認方法からです。

対象とするテーブル情報とデータ

一意になるはずのキーで集約し、件数が1件より大きいデータを抽出します。
HAVING句を使用することで集約後の値に対して条件を指定できます。

キーを指定し、重複データを削除する

一意となるキーごとに削除する場合、一意キー以外の項目でデータに差異がある場合と、差異が全くない場合で方法が異なります。

一意キー以外の項目でデータに差異がある場合は、単純に一意キー以外の項目も条件として指定し、データを削除します。

一意キー以外の項目で差異が全くない場合は、ROWNUM疑似列を利用します。
ROWNUM疑似列を条件に使用することで、対象の件数を絞ることが出来ます。

上記で重複3件のうち2件を削除する事が出来ます。

重複データをまとめて削除する

対象テーブル内の重複データをまとめて削除する場合、どのデータを残してもよい場合と、優先順位をつける場合で方法が異なります。
どちらも、全体のデータ件数が多い場合や重複するデータ数が多い場合は、処理時間がかかることが想定されるます。事前に十分な検証を行いましょう。

どのデータを残してもよい場合は、ORACLEがレコードごとに一意になるようにふっているROWID擬似列を利用します。

残したいデータに優先順位をつける場合(一意キー以外の項目で差異が全くない場合は、1レコードだけ残るように削除する)は、複数回DELETE文を発行します。
以下は、項目cが大きい値を優先して残す場合です。

まとめ

重複データの削除方法、実際に発生するとどうやって削除しようか戸惑うポイントかと思います。
本番運用時に発生し、解決まで時間の猶予なし、ということもあります。

いざ発生しても焦らないように解消方法を頭に入れておきましょう。

sponsored link

管理人

かなめ

フリーの業務系システムエンジニア。情報処理安全確保支援士。 ORACLEと金融と子育ての狭間で、元気に楽しくやってます。 [詳細]

管理人twitter

ブログ村



sponsored link