先排序还是先取值
来源:互联网 发布:二次元绘画软件 编辑:程序博客网 时间:2024/04/29 07:05
先排序还是先取值
题目: 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
jack.li@serviceindeed.com
欢迎交流,转贴请保留以上信息
- 先排序还是先取值
- 先排序还是先取值
- 先排序还是先取值
- 先排序还是先取值
- 先懂事还是先上网?
- 先rollback还是先messagebox
- 先测试还是先代码
- 先放大还是先滤波?
- 先 innodb 还是 myisam
- 先有Function 还是先有 Object
- 先考学历还是先提升能力?
- 先有春天还是先有冬天??
- 先有Class还是先有Object?
- 数据先加载还是先展示?
- 先删缓存还是先删数据库
- 先有鸡蛋还是先有鸡呢!
- 先装windows 还是linux ?
- 先学素描还是速写?
- ORACLE SQL性能优化系列 (十)
- ORACLE SQL性能优化系列 (十一)
- ORACLE SQL性能优化系列 (十二)
- ORACLE SQL性能优化系列 (十三)
- ORACLE SQL性能优化系列 (十四) 完结篇
- 先排序还是先取值
- 神秘的DUAL
- 从不sequential的sequence
- ORACLE 面试问题-技术篇(1)
- ORACLE 面试问题-技术篇(2)
- 水晶报表小技巧1- 动态压缩显示
- VB程序打印水晶报表的典型方法1
- VB程序打印水晶报表的典型方法2
- 一个成功的增量SNAPSHOT 例子