Oracle中的去重

1。用rowid方法据据oracle带的rowid属性,进行判断,是否存在重复,语句如下:
查数据:      select * from table1 a where rowid!=(select   max(rowid)   from table1 b where a.name1=b.name1 anda.name2=b.name2......)
删数据:     delete   from table1 a where rowid!=(select   max(rowid)   from table1 b where a.name1=b.name1 anda.name2=b.name2......)

2.group by方法

查数据:
select count(num), max(name) from student --列出重复的记录数,并列出他的name属性
group by num having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次

删数据: delete from student group by num having count(num) >1 这样的话就把所有重复的都删除了。


3.用distinct方法 -对于小的表比较有用

create table table_new as   select distinct *  from table1 minus truncate table table1; insert into table1 select * from table_new;
 Oracle数据库重复的数据一般有两种去重方法,一、完全重复数据去重;二、部分字段数据重复去重。

  一、完全重复数据去重方法
  对于表中完全重复数据去重,可以采用以下SQL语句。
  Code

  CREATETABLE"#temp"AS (SELECTDISTINCT * FROM 表名);--创建临时表,并把DISTINCT 去重后的数据插入到临时表中
  truncateTABLE 表名;--清空原表数据
  INSERTINTO 表名(SELECT * FROM"#temp");--将临时表数据插入到原表中
  DROPTABLE"#temp";--删除临时表

  具体思路是,首先创建一个临时表,然后将DISTINCT之后的表数据插入到这个临时表中;然后清空原表数据;再讲临时表中的数据插入到原表中;最后删除临时表。

  二、部分数据去重方法
  首先查找重复数据

  select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1
  将上面的>号改为=号就可以查询出没有重复的数据了。
  想要删除这些重复的数据,可以使用下面语句进行删除:
  deletefrom 表名 a where 字段1,字段2 in
  (select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1)
  上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库卡死。
  基于上述情况,可以先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:
  CREATETABLE 临时表 AS
  (select 字段1,字段2,count(*) from 表名 groupby 字段1,字段2 havingcount(*) > 1)
  下面就可以进行这样的删除操作了:
  delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);
  先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。

  上面的语句会把所有重复的全都删除,在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,
我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。

  下面是查询重复数据的一个例子:
  select a.rowid,a.* from 表名 a
  where a.rowid !=
  (
  selectmax(b.rowid) from 表名 b
  where a.字段1 = b.字段1 and
  a.字段2 = b.字段2
  )

  上面括号中的语句是查询出重复数据中rowid最大的一条记录。而外面就是查询出除了rowid最大之外的其他重复的数据了。
  由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:
  deletefrom 表名 a
  where a.rowid !=
  (
  selectmax(b.rowid) from 表名 b
  where a.字段1 = b.字段1 and
  a.字段2 = b.字段2
  )

  同理,上述代码的执行效率毕竟低,所以我们可以考虑建立临时表,将需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。
  createtable 临时表 as
  select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUPBY a.字段1,a.字段2;
  deletefrom 表名 a
  where a.rowid !=
  (
  select b.dataid from 临时表 b
  where a.字段1 = b.字段1 and
  a.字段2 = b.字段2
  );
  commit;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值