Oracle如何实现多个字段去重

  我们通常使用distinct关键字来去除重复记录,还有没有其他办法呢?通过查找资料,确认group by也可以,利用rowid也可以实现功能。其中,group by是用来分组统计的,能用distinct的地方就不要用group by。下面我们看一下几种方法具体如何实现,至于选用哪一种,主要还是看需求,实现功能是最主要的。

  首先我们创建测试表hoegh,插入3条记录。我们可以看到,就前两个字段而言,第二条记录和第三条记录是重复的。

SQL> 
SQL> create table hoegh(h1 number,h2 number,h3 number);
 Table created
SQL> insert into hoegh values(1,1,1);
 1 row inserted
SQL> insert into hoegh values(2,2,2);
 1 row inserted
SQL> insert into hoegh values(2,2,8);
 1 row inserted
SQL> commit;
 Commit complete
 SQL> select * from hoegh;
         H1 H2 H3
---------- ---------- ----------
         1 1 1
         2 2 2
         2 2 8
 SQL>
  使用DISTINCT去重
  如下:
SQL> 
SQL> select distinct h1,h2 from hoegh;
 H1 H2
---------- ----------
1 1
2 2
SQL>

  使用group by去重
 
gruop by是Oracle中常用的分组函数,我们看一下如何使用group by来实现去重功能。

SQL> 
SQL> select h1,h2 from hoegh group by(h1,h2);
         H1 H2
---------- ----------
         1 1
         2 2
 SQL>

 我们需要将重复记录删掉,拿hoegh表来说,我们需要保留h3列值最大的那一行记录,我们可以通过下面语句来实现。
SQL> 
SQL> delete from hoegh
  2 where h3 not in (select max(h3) from hoegh group by h1,h2);
 1 row deleted
 SQL> commit;
 Commit complete
 SQL> select * from hoegh;
         H1 H2 H3
---------- ---------- ----------
         1 1 1
         2 2 8
 SQL>
 使用rowid去重
 ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。通过下面的语句,可以保留重复记录中的最新一条记录(即最后插入的那条记录)。
SQL> 
SQL> delete from hoegh 
  2 where rowid not in
  3 (select max(rowid) from hoegh group by(h1,h2));
 1 row deleted
 SQL> commit;
 Commit complete
SQL> 
SQL> select * from hoegh;
         H1 H2 H3
---------- ---------- ----------
         1 1 1
         2 2 8
 SQL>


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值