oracle數據庫去重復的思路及實現


oracle的去重分為兩種,完全去重和非完全去重。

完全去重

  字段完全重復,在實際工作中使用的概率並不是很大,具體解決思路:

    1.創建臨時表,然后將DISTINCT查詢的數據插入到臨時表中;

      create table tab as(select distinct * from表名);    

    2.清空原表中的數據;

      truncate table tab01;--清除數據后創建該表

    3.將臨時表中的數據插入到原表

      insert into tab01(select * from tab);--插入數據

    4.刪除臨時表

      drop table tab;--刪除臨時表

部分去重

    1.先按照要去重的字段對數據進行分組查詢,判斷要去重數據的數量   

select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1

 

    2.如果要完全刪除所有重復的記錄)(對重復的記錄全部刪除),那么可以先建一張臨時表,然后再刪除,要不然可能會導致數據庫卡死

    

CREATE  TABLE 臨時表 AS

(select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 having count(*) > 1)

  刪除數據

delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 臨時表);

    3.如果是不完全刪除,那么就需要借助rowid這個oracle的隱藏字段,它會給每個字段一個唯一的rowid,我們想保留最新的就要利用這個字段,具體的語句如下

create table 臨時表 as

select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUPBY 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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM