skechers

*******************

原文链接: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/

*******************

分类:

技术点:

相关文章: