日期:2014-05-17  浏览次数:20827 次

关于rownum和order by的疑问
在oracle中如果rownum与order   by同在,是先rownum,然后再order   by  

如   select   *   from   表明   where   rownum <10   order   by   字段
这样会先取rownum小于10的记录,然后再对这10条进行排序

但是,有文章说如果对排序字段建立了所以,则上面的语句就能产生先排序,再rownum的效果。

但是经过我测试,好像建立索引不行,数据条数的物理存储顺序并没有改变,只有建立主键后,才能实现上述的结果。

有没有其他解决方法能先排序在rownum   ,嵌套的方法不算,如下这样的
select   *   from   (select   *   from   表明   order   by   字段)   where   rownum   <   10

------解决方案--------------------
这现象并不是与索引或主键有关...
oracle 执行计划如果从条件开始执行的话一定是先顺序取出num条记录再做排序的..
------解决方案--------------------
感觉楼主说的是对的
建主键就可以的

要是没主键的话,数据会变的
------解决方案--------------------
关注中~~~~~~,这样的问题我也一直存在相同的疑问.
------解决方案--------------------
我试了下,楼主说的正确的
我想没有办法吧,除了嵌套

------解决方案--------------------
讨论rownum和order by是没有意义的
rownum是一个伪列,和数据的组织方式相关,它不能唯一标识记录

如果你没有定义主键或能唯一标识记录的字段的话,唯一标识记录的是rowid,插入一条记录后就为有个唯一的rowid来标识,且rowid不会再改变。

但是如果你的表改变了表空间的话,rowid也可能会改变
------解决方案--------------------
sorry,是我理解偏了.

个人认为,既然嵌套写法已经能实现了,似乎没有办法不用嵌套就能够实现,那么继续讨论这个问题似乎没有多大必要的.
------解决方案--------------------
a:
select a.* ,row_number() over ( order by id ) rn from test a where rownum <6

b:
select * from test where rownum <6 order by id

语句a和语句b绝对是不一样的

语句a的rownum和语句b的rownum是不同的
a的rownum是排序后生成的
b的rownum是排序前生成的

这是SQL语句执行顺序的基本常识

claspcn(扣子)会得出一样的结论可能是因为用id来排序的结果
如果id这个字段本身是主键,或者在添加的时候就是按照升序输入值的,那么这个order by id用不用都会查询到一样的结果
------解决方案--------------------
完全没必要使用嵌套的,使用row_number就可以,rownum 和row_number区别简单些就是,rownum <n是从表里按物理存储位置读取n条后再进行各样的处理,而row_number是先处理(如排序)后再读取N条 ,这也就可以理解rownum为什么不能和> 号一起用的疑问.
------解决方案--------------------
嘿嘿,近段时间收集了rownum的相关资料,可以一起学习一下

http://blog.csdn.net/mantisXF/archive/2007/07/10/1684805.aspx

------解决方案--------------------
除了嵌套外,可以这样实现;

首先建一视图,在视图中做排序

然后在查询中使用下列语句
select * from tablename_v where rownum < 10
------解决方案--------------------
再次向大家道歉
可怜的我,下次一定不乱说了
说错了不要紧,误导了别人就不好了
csdn上贴子不能修改。。。看见上面的几句话联就发烫
重新说一下:
1 rownum : rownum 来自数据库原始顺序
必须从1开始,且一直递增
且查询时只能从1开始查询(即rownum = 1 或者 rownum < N )
rownum = 2 是不会查询到数据的,
2 row_number() : 来自 over ( partition by ** order by ****)
必须从1开始,但是是组内递增,换组再从1开始
查询时需要嵌套,外层方可访问row_number

3 SELECT
row_number()
over (partition by temp1.TEMP_B order by temp1.TEMP_B) AS RR,
temp1.TEMP_A
FROM
temp1
ORDER BY
temp1.TEMP_KEY DESC

最终排序是 order by temp1.TEMP_KEY
order by temp1.TEMP_B 是用来产生ROW_NUMBER的,不参与最终排序
但是如果 ORDER BY temp1.TEMP_KEY DESC 这句没有,那么最终排序就是 order by temp1.TEMP_B

应该没有错了。。。



------解决方案--------------------

1 rownum : rownum 来自order by
必须从1开始,且一直递增