首页 > 开发 > 综合 > 正文

先排序还是先取值

2024-07-21 02:11:32
字体:
来源:转载
供稿:网友

                                                          先排序还是先取值

 

题目:  ms sqlserver和oracle中取出表中按照某字段排序的前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

                                      [email protected]

 

                                      欢迎交流,转贴请保留以上信息
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表