天天看點

查找表資料重複資料 oracle,Oracle 查找與删除表中重複記錄的步驟方法

這時候如果臨時表中有重複資料,無論是主鍵字段businessid有重複,還是一整行有重複都會報出違反唯一主鍵限制錯誤。

方法: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的情況,隻有businessid重複

複制代碼 代碼如下:

select * from cfa where businessid in (select businessid from cfa group by businessid having count(businessid)>1);

如果是b的情況,businessid 和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情況,删除表中多餘的重複記錄,重複記錄是根據單個字段(businessid)來判斷,隻留有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;

免責聲明:本站所有文章和圖檔均來自使用者分享和網絡收集,文章和圖檔版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系網站客服處理。