在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
这样会先取rownum小于10的记录,然后再对这10条进行排序但是,有文章说如果对排序字段建立了所以,则上面的语句就能产生先排序,再rownum的效果。但是经过我测试,好像建立索引不行,数据条数的物理存储顺序并没有改变,只有建立主键后,才能实现上述的结果。有没有其他解决方法能先排序在rownum ,嵌套的方法不算,如下这样的
select * from (select * from 表明 order by 字段) where rownum < 10
解决方案 »
- 存储过程的一个小小问题
- oracle进程无法关闭(急)
- 系统中毒,oracle没有备份,但是,oracle安装后的目录可能还在,如何恢复
- 怎么用sqlldr把指定目录下的所有多个文件导入数据库?目录确定,但文件名及文件个数不定?
- 行转换为列,跟一般要求不同,请大家看看
- exists 语句只可以在select语句中使用吗?
- System.Exception: ORA-06550: 如何解决 真的很急, help!
- 请看下面SQL语句,如何提高效率,畅所欲言,在线讨论!!!
- 我的硬盘装的windows2000,里面有oracle,怎样讲此硬盘放到别的电脑上,因为硬件不相同?
- 怎样指定某个用户只能使用某个回滚段表空间?
- 非常急SQL语句问题!在线等!给高分!
- 请教一条SQL语句
oracle 执行计划如果从条件开始执行的话一定是先顺序取出num条记录再做排序的..
SQL> select * from test a; ID NAME
---------- ----------
1 lasdjfla
3 lasdje23
3 kk
3 bbb
2 lasdje23
2 aaa6 rows selectedSQL> select a.* from test a where rownum <6; ID NAME
---------- ----------
1 lasdjfla
3 lasdje23
3 kk
3 bbb
2 lasdje23SQL> select a.* ,row_number() over ( order by id ) rn from test a where rownum <6; ID NAME RN
---------- ---------- ----------
1 lasdjfla 1
2 lasdje23 2
3 lasdje23 3
3 kk 4
3 bbb 5
SQL>
select * from test where rownum<6 order by id这两条的结果是一样的,和嵌套或按主键来排序的结果是不同的。
rownum是一个伪列,和数据的组织方式相关,它不能唯一标识记录如果你没有定义主键或能唯一标识记录的字段的话,唯一标识记录的是rowid,插入一条记录后就为有个唯一的rowid来标识,且rowid不会再改变。但是如果你的表改变了表空间的话,rowid也可能会改变
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用不用都会查询到一样的结果
必须从1开始,且一直递增
且查询时只能从1开始查询(即rownum = 1 或者 rownum < N )
rownum = 2 是不会查询到数据的,
2 row_number() : 来自 over ( partition by ** order by ****)
必须从1开始,但是是组内递增,换组再从1开始
查询时需要嵌套,外层方可访问row_number
Select row_number() over ( partition by temp1.TEMP_B order by temp1.TEMP_B ) aS RR, temp1.TEMP_A, temp1.TEMP_KEY from temp1
ORDER BY temp1.TEMP_KEY DESC order by temp1.TEMP_B 是用来产生ROW_NUMBER的,不参与最终排序
但是如果 ORDER BY temp1.TEMP_KEY DESC 这句没有,那么最终排序就是 order by temp1.TEMP_B
1 rownum : rownum 来自原数据库顺序,如楼主和各位大大所说,先取ROWNUM,再排序
用 row_number() 一样需要嵌套,不嵌套好像不行
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_number3 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开始,且一直递增
且查询时只能从1开始查询(即rownum = 1 或者 rownum < N )
rownum = 2 是不会查询到数据的,
2 row_number() : 来自 over ( partition by ** order by ****)
必须从1开始,但是是组内递增,换组再从1开始
查询时需要嵌套,外层方可访问row_number
//--------------------------------------------
支持这个.
这一句是错的, rownum 来自原始DB顺序
并非来自order by