Oracleデータベースが重複データを削除した場合!

2815 ワード

重複データ削除技術は、より大きなバックアップ容量を提供し、より長い時間のデータ保存を実現し、バックアップデータの持続的な検証を実現し、データ復旧サービスのレベルを高め、データ災害対応などを容易に実現することができる.重複するデータには、1つ目のタイムテーブルにはいくつかのフィールドが同じで、2つ目のローが完全に同じである場合があります.Oracleデータベースの重複除外テクノロジーには、より大きなバックアップ容量、データの継続的な検証、より高いデータ・リカバリ・サービス・レベル、バックアップ・データの災害復旧を容易にする利点があります.
一、一部のフィールド重複データを削除する
まず、重複するデータのクエリー方法についてお話ししましょう.
次の文では、データが重複していることを確認できます.
selectフィールド1,フィールド2,count(*)fromテーブル名group byフィールド1,フィールド2 having count(*)>1
上の>番号を=番号に変更すると、重複していないデータがクエリーされます.
重複するデータを削除するには、次の文を使用します.
delete fromテーブル名a whereフィールド1,フィールド2 in
(selectフィールド1,フィールド2,count(*)fromテーブル名group byフィールド1,フィールド2 having count(*)>1)
上の文は非常に簡単で、クエリーしたデータを削除します.しかし、この削除の実行効率は非常に低く、ビッグデータ量ではデータベースが首になる可能性があります.したがって、クエリーされた重複するデータを一時テーブルに挿入して削除することをお勧めします.これにより、削除を実行するときにクエリーを1回行わなくてもいいです.次のようになります.
CREATE TABLE仮表AS
(selectフィールド1,フィールド2,count(*)fromテーブル名group byフィールド1,フィールド2 having count(*)>1)
ここでは、テンポラリ・テーブルを作成し、クエリーされたデータを挿入します.
次のように削除できます.
delete fromテーブル名a whereフィールド1、フィールド2 in(selectフィールド1、フィールド2 from一時テーブル);
このような一時テーブルを作成してから削除する操作は、直接1つの文で削除するよりもずっと効率的です.
この時、皆さんは飛び出して何を言いますか?あなたは私たちにこの文を実行するように言ったが、それはすべての繰り返しを削除したのではないでしょうか.重複データの最新の記録を残したいと思います.皆さん、焦らないでください.次はこのような操作をする方法について話します.
Oracleでは、自動rowidが隠されており、各レコードに一意のrowidが記録されています.最新のレコードを保持したい場合は、
このフィールドを使用して、重複データのrowid最大のレコードを保持すればいいです.
次に、重複するデータをクエリーする例を示します.
 
select a.rowid,a.*fromテーブル名a where a.rowid!=(select max(b.rowid)fromテーブル名b where a.フィールド1=b.フィールド1 and a.フィールド2=b.フィールド2)
 
次に説明します.カッコの文は、重複データのrowidをクエリーする最大のレコードです.
外はrowidが最も大きい以外の重複したデータをクエリーします.
これにより、重複データを削除し、最新のデータを1つだけ残して、このように書くことができます.
 
delete fromテーブル名a where a.rowid!=(select max(b.rowid)fromテーブル名b where a.フィールド1=b.フィールド1 and a.フィールド2=b.フィールド2)
 
ちなみに、上記の文の実行効率は低く、重複するフィールドを判断し、rowidをテンポラリ・テーブルに挿入し、削除する際に比較する必要があるテンポラリ・テーブルを構築することも考えられます.
delete from t where t.rowid not in(
select max(tt.rowid) from t tt group by tt.tname)

 
 
create table仮表as select a.フィールド1,a.フィールド2,MAX(a.ROWID)dataid from正式表a GROUP BY a.フィールド1,a.フィールド2;delete fromテーブル名a where a.rowid!=(select b.dataid from仮表b where a.フィールド1=b.フィールド1 and a.フィールド2=b.フィールド2);  commit;
 
二、重複記録を完全に削除する
表の2行のレコードがまったく同じ場合、次の文で重複データを削除したレコードを取得できます.
select distinct*fromテーブル名
クエリーのレコードをテンポラリ・テーブルに配置し、元のテーブル・レコードを削除し、最後にテンポラリ・テーブルのデータを元のテーブルに戻すことができます.次のようになります.
 
CREATE TABLE仮表AS(select distinct*from表名);truncate table正式表;--注:もともとペンがdrop tableの正式表に誤って書かれていたため、今はinsert into正式表(select*from臨時表)を修正しました.drop tableテンポラリテーブル;
 
テーブルの重複データを削除する場合は、まずテンポラリ・テーブルを作成し、重複データを削除したデータをテンポラリ・テーブルにインポートし、次に、テンポラリ・テーブルから正式なテーブルにデータをインポートします.
 
  INSERT INTO t_table_bak   select distinct * from t_table;