*******************
原文链接:http://blog.itpub.net/30162081/viewspace-1610737/
*******************
我们通常使用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 9 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>
*******************
原文链接:http://blog.itpub.net/30162081/viewspace-1610737/
*******************