分享

Oracle如何实现多个字段去重

 好闺女瑶瑶 2016-01-07
        我们通常使用distinct关键字来去除重复记录,还有没有其他办法呢?通过查找资料,确认group by也可以,利用rowid也可以实现功能。其中,group by是用来分组统计的,能用distinct的地方就不要用group by。下面我们看一下几种方法具体如何实现,至于选用哪一种,主要还是看需求,实现功能是最主要的。
       首先我们创建测试表hoegh,插入3条记录。我们可以看到,就前两个字段而言,第二条记录和第三条记录是重复的。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> create table hoegh(h1 number,h2 number,h3 number);
  3.  
  4. Table created
  5. SQL> insert into hoegh values(1,1,1);
  6.  
  7. 1 row inserted
  8. SQL> insert into hoegh values(2,2,2);
  9.  
  10. 1 row inserted
  11. SQL> insert into hoegh values(2,2,8);
  12.  
  13. 1 row inserted
  14. SQL> commit;
  15.  
  16. Commit complete
  17.  
  18. SQL> select * from hoegh;
  19.  
  20.         H1 H2 H3
  21. ---------- ---------- ----------
  22.          1 1 1
  23.          2 2 2
  24.          2 2 8
  25.  
  26. SQL>

使用DISTINCT去重
        如下:

点击(此处)折叠或打开

  1. SQL>
  2. SQL> select distinct h1,h2 from hoegh;
  3.  
  4. H1 H2
  5. ---------- ----------
  6. 1 1
  7. 2 2

  8. SQL>

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

点击(此处)折叠或打开

  1. SQL>
  2. SQL> select h1,h2 from hoegh group by(h1,h2);
  3.  
  4.         H1 H2
  5. ---------- ----------
  6.          1 1
  7.          2 2
  8.  
  9. SQL>
        我们需要将重复记录删掉,拿hoegh表来说,我们需要保留h3列值最大的那一行记录,我们可以通过下面语句来实现。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> delete from hoegh
  3.   2 where h3 not in (select max(h3) from hoegh group by h1,h2);
  4.  
  5. 1 row deleted
  6.  
  7. SQL> commit;
  8.  
  9. Commit complete
  10.  
  11. SQL> select * from hoegh;
  12.  
  13.         H1 H2 H3
  14. ---------- ---------- ----------
  15.          1 1 1
  16.          2 2 8
  17.  
  18. SQL>
使用rowid去重
       ROWID是数据的详细地址,通过rowid,oracle可以快速的定位某行具体的数据的位置。通过下面的语句,可以保留重复记录中的最新一条记录(即最后插入的那条记录)。

点击(此处)折叠或打开

  1. SQL>
  2. SQL> delete from hoegh
  3.   2 where rowid not in
  4.   3 (select max(rowid) from hoegh group by(h1,h2));
  5.  
  6. 1 row deleted
  7.  
  8. SQL> commit;
  9.  
  10. Commit complete
  11.  
  12. SQL>
  13. SQL> select * from hoegh;
  14.  
  15.         H1 H2 H3
  16. ---------- ---------- ----------
  17.          1 1 1
  18.          2 2 8
  19.  
  20. SQL>




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多