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;