现在的位置: 首页 > 综合 > 正文

MS SQLSERVER和ORACLE中取出表中按照某字段排序的前N条记录

2013年09月07日 ⁄ 综合 ⁄ 共 1907字 ⁄ 字号 评论关闭

MS SQLSERVERORACLE中取出表中按照某字段排序的前N条记录

 
这个题目看上去似乎那么简单, 两种数据库都提供ORDER BY 子句. 问题应该能够迎刃而解吧.
 
先试一下MS SQLSERVER是怎么做的:
     
use Northwind;
create table TestSort (ID integer);
insert into testSort values (3);
insert into testSort values (1);
insert into testSort values (4);
insert into testSort values (2);
select * from testSort;    
-----------------------------------------
ID         
-----------
3
1
4
2
(4 row(s) affected)
 
假设我们要取出按照ID排序的前三条记录:
    
select TOP 3 * from testSort order by ID ;       
-----------------------------------------
ID         
-----------
1
2
3
(3 row(s) affected) 
 
很简单,一句话就解决了.
 
再试一下ORACLE (这里用ORACLE9i)
SQL> create table TestSort ( ID number);
Table created.
SQL> insert into testSort values (3);
1 row created.
SQL> insert into testSort values (1);
1 row created.
SQL> insert into testSort values (4);
1 row created.
SQL> insert into testSort values (2);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from testSort;
ID
----------
         3
         1
         4
         2
 
ORACLE没有MS SQLSERVER中取前N条记录的TOP语法. 但是有ROWNUM可以用来完成类似功能.
 
SQL> select * from TestSort where rownum <= 3 order by ID;
ID
----------
         1
         3
         4
 
结果是不是有点出乎意料? 它并没有返回所要求的 1 , 2 , 3的结果 . ORACLE先根据rownum <=3的条件限制选取一个范围集合(3,1,4), 然后再在这个集合里进行排序.
ORDER BY 子句是在合适的记录被取出后才起作用.
原来如此, 那么在ORACLE中如何才能实现这个功能呢?
通常我们可以采用这种办法:
SQL> select * from (select * from TestSort order by ID) where rownum <=3;
        ID
----------
         1
         2
         3
 
    有点麻烦,不过也只能这样.
   
相同道理, 如果想从表中取出按照某字段排序前M到N条记录
下面的ORACLE语句是最好的:
 
SQL> select ID from
    (
       select ID , rownum as con from
       (
        select ID from TestSort order by ID
       )
       where rownum <= 3   /*N*/
     )
     where con >= 2; /*M */
 
       
 
ID
----------
         2
         3
 
MS SQLSERVER中也可以用类似的思路解决此类问题.
 
当然你也可以用笨一点的办法, 比如用前N条记录的集合MINUS前M-1条记录的集合得到
前M到N条记录集合. (有点象饶口令) , 不过MS SQLSERVER好象不支持MINUS之类的集合操作.
 
看来小小的一个排序取值问题还真不是那么简单呢 !
 
 
                                      Black_Snail
                                      Ligang1000@hotmail.com
 
                                      欢迎交流,转贴请保留以上信息
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=98363

 

抱歉!评论已关闭.