分享
 
 
 

先排序还是先取值

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

先排序还是先取值

题目: 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

Ligang1000@hotmail.com

欢迎交流,转贴请保留以上信息

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有