SELECT * FROM tab WHERE rownum < 10 ORDER BY id;先按tab中存储的记录的顺序取出9条记录,然后再将取出来的9条记录按id排序,不能保证取出来的记录id是整个表中最小的9条。SELECT * FROM (SELECT * FROM tab ORDER BY id) WHERE rownum < 10;
先将tab中存储的所有记录按id排序,再将排序后的记录取出前9条,是取出id最小的9条记录的oracle的写法,取出来的记录id是整个表中最小的9条
以上与id是否为主键无关,只是如果你的id是主键又是递增存储的话与记录的物理顺序正好对应,两句取出来的结果一样只是一种巧合。
先将tab中存储的所有记录按id排序,再将排序后的记录取出前9条,是取出id最小的9条记录的oracle的写法,取出来的记录id是整个表中最小的9条
以上与id是否为主键无关,只是如果你的id是主键又是递增存储的话与记录的物理顺序正好对应,两句取出来的结果一样只是一种巧合。
解决方案 »
- 账号被锁
- 能否实现以下 行转列?
- oracle跨库两表联合查询没数据
- oracle中存储过程调用JAVA程序出错
- oracle 靠什么挣钱???????????????????
- SQLSERVER2000数据库迁移到oracle10G,要注意些啥吗?
- ORACLE817的那些特性在ORACLE9I中不再支持
- 关于执行exp命令时的报错
- 要将一台服务器上的oracle数据库迁移到另一台服务器上去,该怎么做?
- 为TCP协议提供的信息当前正由其他监听程序使用. 谢谢高手指点!
- 数据库备份和恢复问题???
- 我创建了一个存储过程test,执行这个存储过程 exec test; 第一次时成功了,再执行exec test; sql plus程序死了
先将tab中存储的所有记录按id排序,再将排序后的记录取出前9条,是取出id最小的9条记录的oracle的写法,取出来的记录id是整个表中最小的9条完全同意!但是最后一句,我有点疑问
Select * From z_test
name code id
111 1 1
222 2 2
555 5 5
444 4 4
333 3 3id是主键SELECT * FROM z_test WHERE rownum < 4 ORDER BY id;
SELECT * FROM (SELECT * FROM z_test ORDER BY id) WHERE rownum < 4
结果集相同
name code id
111 1 1
222 2 2
333 3 3
SELECT * FROM z_test WHERE rownum < 4 ORDER BY code;
SELECT * FROM (SELECT * FROM z_test ORDER BY code) WHERE rownum < 4
结果集不同,分别为:
name code id
111 1 1
222 2 2
555 5 5name code id
111 1 1
222 2 2
333 3 3上面两条sql和下面两条sql的差别就是order by的字段不同,值相同,一个是code,一个是id(主键)望达人解释
先选出table表中前N条记录,再按id列进行排序
----------------------------------------------------------------
SELECT * FROM (SELECT * FROM table ORDER BY id) WHERE rownum < N;
先对table表按id列进行排序,再取出排序后的前N条记录
补充一点:
SELECT * FROM tab WHERE rownum < 10 ORDER BY id;
当id为primary key的时候,
如果该查询走索引,那么很可能结果和
SELECT * FROM (SELECT * FROM tab ORDER BY id) WHERE rownum < 10;,
因为主键索引通常都是排序的,走索引那么相当于已经排序取前10条记录;
--不过即使是索引,这个查询可能还是不走索引的,所以用这个方法取前10是不可靠的
http://community.csdn.net/Expert/topic/4284/4284355.xml?temp=.5392725
--------------------------------------------
但是即使是主键,但是查询可能还是不走索引的,所以结果可能还是不一样的
走不走索引oracle有自己的一套原则
比如这张表数据很少就几十条,那么就很可能不走索引,因为这个时候走索引效率反而下降