怎样删除一个表中的重复行?

怎样删除一个表中的重复行

jettli ( 李杰一级用户 该版得分小于等于100分    2003-03-14 14:26:32 在  Oracle /  基础和管理 提问

如题
问题点数: 20、回复次数: 6
1楼  hrb_qiuyb   ( 晨钟暮鼓) 二星用户 该版得分小于等于30000分,大于10000分  回复于  2003-03-14 14:32:02  得分  10

引自www.oradb.net  
  软件环境:    
  1、Windows   NT4.0+ ORACLE   8.0.4  
  2、 ORACLE安装路径为:C:/ORANT  
   
  问题提出:    
  1、当我们想要为一个表创建唯一索引时,如果该表有重复的记录,则无法创建成功。    
  方法原理:    
  1、 Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,  
      rowid确定了每条记录是在 ORACLE中的哪一个数据文件、块、行上。  
   
  2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中  
      那些具有最大rowid的就可以了,其余全部删除。  
   
  3、以下语句用到了3项技巧:rowid、子查询、别名。  
   
  实现方法:    
  SQL>   create   table   a   (  
      2     bm   char(4), --编码  
      3     mc   varchar2(20) --名称  
      4     )  
      5     /  
   
  表已建立.  
   
  SQL>   insert   into   a   values('1111','1111');  
  SQL>   insert   into   a   values('1112','1111');  
  SQL>   insert   into   a   values('1113','1111');  
  SQL>   insert   into   a   values('1114','1111');  
   
  SQL>   insert   into   a   select   *   from   a;  
   
  插入4个记录.  
   
  SQL>   commit;  
   
  完全提交.  
   
  SQL>   select   rowid,bm,mc   from   a;  
   
  ROWID                             BM       MC  
  ------------------   ----   -------  
  000000D5.0000.0002   1111   1111  
  000000D5.0001.0002   1112   1111  
  000000D5.0002.0002   1113   1111  
  000000D5.0003.0002   1114   1111  
  000000D5.0004.0002   1111   1111  
  000000D5.0005.0002   1112   1111  
  000000D5.0006.0002   1113   1111  
  000000D5.0007.0002   1114   1111  
   
  查询到8记录.  
   
   
  查出重复记录  
  SQL>   select   rowid,bm,mc   from   a   where   a.rowid!=(select   max(rowid)   from   a   b   where   a.bm=b.bm   and   a.mc=b.mc);  
   
  ROWID                             BM       MC  
  ------------------   ----   --------------------  
  000000D5.0000.0002   1111   1111  
  000000D5.0001.0002   1112   1111  
  000000D5.0002.0002   1113   1111  
  000000D5.0003.0002   1114   1111  
   
 
Top
删除重复记录  
  SQL>   delete   from   a   a   where   a.rowid!=(select   max(rowid)   from   a   b   where   a.bm=b.bm   and   a.mc=b.mc);  
   
  删除4个记录.  
   
  SQL>   select   rowid,bm,mc   from   a;  
   
  ROWID                             BM       MC  
  ------------------   ----   --------------------  
  000000D5.0004.0002   1111   1111  
  000000D5.0005.0002   1112   1111  
  000000D5.0006.0002   1113   1111  
  000000D5.0007.0002   1114   1111  
   
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值