オラクルで重複レコードを削除する方法

ページ名:オラクルで重複レコードを削除する方法

Oracleで作業していると、レコードの一部が重複していることがあります。これらの重複行を削除するには、その行を特定し、RowID(行アドレス)を使用します。レコードを削除した後に参照する必要がある場合に備えて、作業を始める前にバックアップ・テーブルを作成しておく必要があります。

方法1

重複行を特定する

  1. 重複を特定する。この場合、重複の例である "Alan "を特定する。以下のSQLを入力して、削除しようとしているレコードが実際に重複していることを確認してください。
  2. "Names "という名前のカラムから特定する。Names "という名前のカラムの例では、"column_name "をNamesに置き換える。
  3. 他のカラムから特定する。別の列、例えばアランの名前ではなく年齢で重複を識別しようとする場合、"Ages "を "column_name "の代わりに入力する。
    select column_name, count(column_name) from table group by column_name having count (column_name) > 1;
方法2

単一の重複を削除する

  1. namesからnameを選択する。SQL "の後に "select name from names "と入力する。
  2. 重複する名前の行をすべて削除する。SQL "の後に "delete from names where name='Alan'; "と入力する。ここでは大文字小文字が重要なので、"Alan "という名前の行をすべて削除する。SQL "の後に "commit "と入力する。
  3. 重複のない行をレントします。これで、"Alan "という例の名前を持つ行をすべて削除したので、"insert into name values ('Alan'); "と入力することで、1行挿入することができる。SQL "の後に "commit "を入力し、新しい行を作成する。
  4. 新しいリストを見る。上記の手順が完了したら、"select * from names "と入力して、重複レコードがなくなったことを確認することができる。
    SQL > select name from names; NAME ------------------------------ Alan Carrie Tom Alan 行が選択されました。 SQL > delete from names where name='Alan'; 行が削除されました。 SQL > commit; コミットが完了しました。 SQL > insert into names values ('Alan'); 行が作成されました。 SQL > commit; コミットが完了しました。 SQL > select * from names; NAME ------------------------------ Alan Carrie Tom 行が選択されました。
方法3

複数の重複行を削除する

  1. 削除したいRowIDを選択する。SQL "の後に、"select rowid, name from names; "と入力する。
  2. 重複を削除する。SQL "の後に "delete from names a where rowid > (select min(rowid) from names b where b.name=a.name); "と入力し、重複レコードを削除する。
  3. 重複のチェック上記が完了したら、"select rowid,name from names; "と入力し、"commit "することで、まだ重複レコードがあるかどうかをコマンドでチェックする。
    SQL > select rowid,name from names; ROWID NAME ------------------ ------------------------------ AABJnsAAGAAAdfOAAA Alan AABJnsAAGAAAdfOAAB Alan AABJnsAAGAAAdfOAAC Carrie AABJnsAAGAAAdfOAAD Tom AABJnsAAGAAAdfOAAF Alan 行が選択されました。 SQL > delete from names a where rowid > (select min(rowid) from names b where b. name ); rows selected.name=a.name ); 行が削除されました。 SQL > select rowid,name from names; ROWID NAME ------------------ ------------------------------ AABJnsAAGAAAdfOAAA Alan AABJnsAAGAAAdfOAAC Carrie AABJnsAAGAAAdfOAAD Tom 行が選択されました。 SQL > commit; コミットが完了しました。
方法4

列を含む行の削除

  1. 行を選択する。SQL "の後に "select * from names; "と入力すると、行が表示される。
  2. カラムを特定して重複行を削除する。SQL "の後に、"delete from names a where rowid > (select min(rowid) from names b where b.name=a.name and b.age=a.age);" と入力し、重複レコードを削除する。
  3. 重複のチェック上記の手順が完了したら、"select * from names; "と入力し、"commit "することで、重複レコードが正常に削除されたことを確認する。
    SQL > select * from names; NAME AGE ------------------------------ ---------- Alan 50 Carrie 51 Tom 52 Alan 50行が選択されました。 SQL > delete from names a where rowid > (select min(rowid) from names b where b.name=a.name and b.age=a.age ); 行が削除されました。 SQL > select * from names; NAME AGE ------------------------------ ---------- Alan 50 Carrie 51 Tom 52行が選択されました。 SQL > commit; コミットが完了しました。
この記事は、CC BY-NC-SAの下で公開されている " How to Delete Duplicate Records in Oracle "を改変して作成しました。特に断りのない限り、CC BY-NC-SAの下で利用可能です。

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する

NG表示方式

NGID一覧