欢迎你光临金州视窗网站!网址:www.c0859.com

商务领航   互联星空  我的e家  网上客服  服务督察  

首页 | 新闻 | | 股票 | 笑话 | 人才招聘 | 体育 | 教育 | 高考 | 奥运 | | 企业黄页 | 网络直播间
图片 | 健康 | IT技术 | 娱乐 | 汽车 | 电脑医院 | 旅游 | 电影 | 文学 | 游戏 | 国际足球 | 便民服务 | 电脑 播客
 天气查询  火车查询  在线杀毒   七彩铃音  网速测试 算命  短信息  ADSL宽带 118114服务
  首页 | 网络技术 | 病毒播报 | 图形设计 | 网站建设 | 服务器相关 | 电脑硬件 | 黑客技术 | 数据库技术 | 门户·搜索

 
你当前位置:首页 > IT技术 > 数据库技术
oracle中如何删除重复数据

发布:2008-04-02   来自:网友或互联网   编辑:ouys  查看:

 我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢?ux4金州视窗!了解黔西南,从金州视窗开始!
        重复的数据可能有这样两种情况,第一种时表中只有某些字段一样,第二种是两行记录完全一样。ux4金州视窗!了解黔西南,从金州视窗开始!
一、对于部分字段重复数据的删除ux4金州视窗!了解黔西南,从金州视窗开始!
        先来谈谈如何查询重复的数据吧。ux4金州视窗!了解黔西南,从金州视窗开始!
        下面语句可以查询出那些数据是重复的:ux4金州视窗!了解黔西南,从金州视窗开始!
  select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1ux4金州视窗!了解黔西南,从金州视窗开始!
        将上面的>号改为=号就可以查询出没有重复的数据了。ux4金州视窗!了解黔西南,从金州视窗开始!
        想要删除这些重复的数据,可以使用下面语句进行删除ux4金州视窗!了解黔西南,从金州视窗开始!
  delete from 表名 a where 字段1,字段2 inux4金州视窗!了解黔西南,从金州视窗开始!
    (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)ux4金州视窗!了解黔西南,从金州视窗开始!
        上面的语句非常简单,就是将查询到的数据删除掉。不过这种删除执行的效率非常低,对于大数据量来说,可能会将数据库吊死。所以我建议先将查询到的重复的数据插入到一个临时表中,然后对进行删除,这样,执行删除的时候就不用再进行一次查询了。如下:ux4金州视窗!了解黔西南,从金州视窗开始!
  CREATE TABLE 临时表 ASux4金州视窗!了解黔西南,从金州视窗开始!
  (select 字段1,字段2,count(*) from 表名 group by 字段1,字段2 having count(*) > 1)ux4金州视窗!了解黔西南,从金州视窗开始!
        上面这句话就是建立了临时表,并将查询到的数据插入其中。ux4金州视窗!了解黔西南,从金州视窗开始!
        下面就可以进行这样的删除操作了:ux4金州视窗!了解黔西南,从金州视窗开始!
  delete from 表名 a where 字段1,字段2 in (select 字段1,字段2 from 临时表);ux4金州视窗!了解黔西南,从金州视窗开始!
        这种先建临时表再进行删除的操作要比直接用一条语句进行删除要高效得多。ux4金州视窗!了解黔西南,从金州视窗开始!
  ux4金州视窗!了解黔西南,从金州视窗开始!
       这个时候,大家可能会跳出来说,什么?你叫我们执行这种语句,那不是把所有重复的全都删除吗?而我们想保留重复数据中最新的一条记录啊!大家不要急,下面我就讲一下如何进行这种操作。ux4金州视窗!了解黔西南,从金州视窗开始!
       在oracle中,有个隐藏了自动rowid,里面给每条记录一个唯一的rowid,我们如果想保留最新的一条记录,ux4金州视窗!了解黔西南,从金州视窗开始!
我们就可以利用这个字段,保留重复数据中rowid最大的一条记录就可以了。ux4金州视窗!了解黔西南,从金州视窗开始!
       下面是查询重复数据的一个例子:ux4金州视窗!了解黔西南,从金州视窗开始!
  select a.rowid,a.* from 表名 a ux4金州视窗!了解黔西南,从金州视窗开始!
 where a.rowid != ux4金州视窗!了解黔西南,从金州视窗开始!
 (ux4金州视窗!了解黔西南,从金州视窗开始!
  select max(b.rowid) from 表名 b ux4金州视窗!了解黔西南,从金州视窗开始!
  where a.字段1 = b.字段1 and ux4金州视窗!了解黔西南,从金州视窗开始!
  a.字段2 = b.字段2 ux4金州视窗!了解黔西南,从金州视窗开始!
 )ux4金州视窗!了解黔西南,从金州视窗开始!
       下面我就来讲解一下,上面括号中的语句是查询出重复数据中rowid最大的一条记录。ux4金州视窗!了解黔西南,从金州视窗开始!
       而外面就是查询出除了rowid最大之外的其他重复的数据了。ux4金州视窗!了解黔西南,从金州视窗开始!
       由此,我们要删除重复数据,只保留最新的一条数据,就可以这样写了:ux4金州视窗!了解黔西南,从金州视窗开始!
 delete from 表名 a ux4金州视窗!了解黔西南,从金州视窗开始!
 where a.rowid != ux4金州视窗!了解黔西南,从金州视窗开始!
 (ux4金州视窗!了解黔西南,从金州视窗开始!
  select max(b.rowid) from 表名 b ux4金州视窗!了解黔西南,从金州视窗开始!
  where a.字段1 = b.字段1 and ux4金州视窗!了解黔西南,从金州视窗开始!
  a.字段2 = b.字段2 ux4金州视窗!了解黔西南,从金州视窗开始!
 )ux4金州视窗!了解黔西南,从金州视窗开始!
 ux4金州视窗!了解黔西南,从金州视窗开始!
       随便说一下,上面语句的执行效率是很低的,可以考虑建立临时表,讲需要判断重复的字段、rowid插入临时表中,然后删除的时候在进行比较。ux4金州视窗!了解黔西南,从金州视窗开始!
  create table 临时表 as ux4金州视窗!了解黔西南,从金州视窗开始!
    select a.字段1,a.字段2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.字段1,a.字段2;ux4金州视窗!了解黔西南,从金州视窗开始!
  delete from 表名 a ux4金州视窗!了解黔西南,从金州视窗开始!
 where a.rowid != ux4金州视窗!了解黔西南,从金州视窗开始!
 (ux4金州视窗!了解黔西南,从金州视窗开始!
  select b.dataid from 临时表 b ux4金州视窗!了解黔西南,从金州视窗开始!
  where a.字段1 = b.字段1 and ux4金州视窗!了解黔西南,从金州视窗开始!
  a.字段2 = b.字段2 ux4金州视窗!了解黔西南,从金州视窗开始!
 );ux4金州视窗!了解黔西南,从金州视窗开始!
 commit;ux4金州视窗!了解黔西南,从金州视窗开始!
  ux4金州视窗!了解黔西南,从金州视窗开始!
二、对于完全重复记录的删除ux4金州视窗!了解黔西南,从金州视窗开始!
  ux4金州视窗!了解黔西南,从金州视窗开始!
        对于表中两行记录完全一样的情况,可以用下面语句获取到去掉重复数据后的记录:ux4金州视窗!了解黔西南,从金州视窗开始!
  select distinct * from 表名ux4金州视窗!了解黔西南,从金州视窗开始!
  可以将查询的记录放到临时表中,然后再将原来的表记录删除,最后将临时表的数据导回原来的表中。如下:ux4金州视窗!了解黔西南,从金州视窗开始!
  CREATE TABLE 临时表 AS (select distinct * from 表名);ux4金州视窗!了解黔西南,从金州视窗开始!
  drop table 正式表;ux4金州视窗!了解黔西南,从金州视窗开始!
  insert into 正式表 (select * from 临时表);ux4金州视窗!了解黔西南,从金州视窗开始!
  drop table 临时表;

      如果想删除一个表的重复数据,可以先建一个临时表,将去掉重复数据后的数据导入到临时表,然后在从ux4金州视窗!了解黔西南,从金州视窗开始!
临时表将数据导入正式表中,如下:ux4金州视窗!了解黔西南,从金州视窗开始!
INSERT INTO t_table_bakux4金州视窗!了解黔西南,从金州视窗开始!
select distinct * from t_table;ux4金州视窗!了解黔西南,从金州视窗开始!


上一篇:打破oracle数据库神话
下一篇:Oracle用Start with...Connect By子句递归查询

关于本站 | 广告业务| 合作伙伴 | 招聘信息 | 网站地图 | 免责声明 | 联系我们
金州视窗 黔西南神舟电脑学校旗下站 WWW.C0859.COM 版权所有 地址:贵州省兴义市遵义路一巷一号
站长:欧阳树 车清江  电话:13885938054  联系QQ:412890897 675799550 912080222
Copyright © 2008-2009 金州视窗 Inc. All Rights Reserved  备案中...