Oracleで作業していると、レコードの一部が重複していることがあります。これらの重複行を削除するには、その行を特定し、RowID(行アドレス)を使用します。レコードを削除した後に参照する必要がある場合に備えて、作業を始める前にバックアップ・テーブルを作成しておく必要があります。
重複行を特定する
-
重複を特定する。この場合、重複の例である "Alan "を特定する。以下のSQLを入力して、削除しようとしているレコードが実際に重複していることを確認してください。
-
"Names "という名前のカラムから特定する。Names "という名前のカラムの例では、"column_name "をNamesに置き換える。
-
他のカラムから特定する。別の列、例えばアランの名前ではなく年齢で重複を識別しようとする場合、"Ages "を "column_name "の代わりに入力する。select column_name, count(column_name) from table group by column_name having count (column_name) > 1;
単一の重複を削除する
-
namesからnameを選択する。SQL "の後に "select name from names "と入力する。
-
重複する名前の行をすべて削除する。SQL "の後に "delete from names where name='Alan'; "と入力する。ここでは大文字小文字が重要なので、"Alan "という名前の行をすべて削除する。SQL "の後に "commit "と入力する。
-
重複のない行をレントします。これで、"Alan "という例の名前を持つ行をすべて削除したので、"insert into name values ('Alan'); "と入力することで、1行挿入することができる。SQL "の後に "commit "を入力し、新しい行を作成する。
-
新しいリストを見る。上記の手順が完了したら、"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 行が選択されました。
複数の重複行を削除する
-
削除したいRowIDを選択する。SQL "の後に、"select rowid, name from names; "と入力する。
-
重複を削除する。SQL "の後に "delete from names a where rowid > (select min(rowid) from names b where b.name=a.name); "と入力し、重複レコードを削除する。
-
重複のチェック上記が完了したら、"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; コミットが完了しました。
列を含む行の削除
-
行を選択する。SQL "の後に "select * from names; "と入力すると、行が表示される。
-
カラムを特定して重複行を削除する。SQL "の後に、"delete from names a where rowid > (select min(rowid) from names b where b.name=a.name and b.age=a.age);" と入力し、重複レコードを削除する。
-
重複のチェック上記の手順が完了したら、"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; コミットが完了しました。
コメント
最新を表示する
NG表示方式
NGID一覧