Oracle検索と削除テーブルに重複して記録されるステップ方法


この場合、一時テーブルに重複データがあると、メインキーフィールドのbusiness sidが重複していても、行全体が重複していても、一意のプライマリキー制約に違反するエラーが発生します。
方法:group by XX having count(*)>1、rowid、distinct、temporary table、procedure
1、クエリーテーブルの重複データa.フィールドを繰り返す
b.複数のフィールドを繰り返す
c.行全体を繰り返す
試験表の作成:

create table cfa (businessid number,customer varchar2(50),branchcode varchar2(10),data_date varchar2(10));
insert into cfa values (1,'Albert','SCB','2011-11-11');
insert into cfa values (2,'Andy','DB','2011-11-12');
insert into cfa values (3,'Allen','HSBC','2011-11-13');

--------------- ----------------------------------------------
insert into cfa values (1,'Alex','ICBC','2011-11-14');
insert into cfa values (1,'Albert','CTBK','2011-11-15');
insert into cfa values (1,'Albert','SCB','2011-11-11');


aの場合は、business sidだけが重複します。

select * from cfa where businessid in (select businessid from cfa group by businessid having count(businessid)>1);
bの場合、business sidとnameは同時に

select * from cfa where (businessid,customer) in (select businessid,customer from cfa group by businessid,customer having count(*)>1);
を繰り返す場合があります。cの場合は、行全体を繰り返します。
bを参照する方法:

select * from cfa where (businessid,customer,branchcode,data_date) in (select * from cfa group by businessid,customer,branchcode,data_date having count(*)>1);
2、表中の重複データaを削除する場合、表中の余分な重複記録を削除し、重複記録は単一フィールドによって判断され、rowidの最小記録のみが残る。
rowidは最小記録ではなく、コード中のminをmaxに変更する必要があります。ここでは説明を省略します。

delete from cfa
where businessid in (select businessid
from cfa
group by businessid
having count(businessid) > 1)
and rowid not in (select min(rowid)
from cfa
group by businessid
having count(businessid) > 1);
または、以下のより簡単で効率的な文を使用します。

DELETE FROM cfa t
WHERE t.ROWID >
(SELECT MIN(X.ROWID) FROM cfa X WHERE X.businessid = t.businessid);
bの場合、表の余分な重複記録(複数のフィールド)を削除し、rowidの最小記録のみを残します。

delete from cfa
where (businessid,customer) in (select businessid,customer
from cfa
group by businessid,customer
having count(*) > 1)
and rowid not in (select min(rowid)
from cfa
group by businessid,customer
having count(*) > 1);
または、以下のより簡単で効率的な文を使います。

DELETE FROM cfa t
WHERE t.ROWID > (SELECT MIN(X.ROWID)
FROM cfa X
WHERE X.businessid = t.businessid
and x.customer = t.customer);
cの場合、この場合は比較的簡単です。臨時表の方法を使います。

create table cfabak as select distinct * from cfa;

truncate table cfa;-- backup

Insert into cfa select * from cfabak;

commit;