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;