Oracle在rownum使用结果集排序

   对于 Oracle 的 rownum 问题,非常多资料都说不支持>,>=,=,between...and,仅仅能用以上符号(<、<=、!=),并不是说用>,>=,=,between..and 时会提示SQL语法错误。而是常常是查不出一条记录来,还会出现似乎是莫名其妙的结果来。事实上您仅仅要理解好了这个 rownum 伪列的意义就不应该感到惊奇,相同是伪列,rownum 与 rowid 可有些不一样,以下以样例说明



   有一张表:tbrole

    若是运行语句select r.*,rownum from tbrole r where rownum > 10;----结果经常查不出不论什么结果。可是查看数据库的时候我们却是能够看到数据库中有记录的。



   假设用 select rownum,c1 from t1 where rownum < 10, 仅仅要是用小于号,查出来的结果非常easy地与一般理解在概念上能达成一致,应该不会有不论什么疑问的。

先好好理解 rownum 的意义吧。由于ROWNUM是对结果集加的一个伪列。即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1開始排起的。

所以你选出的结果不可能没有1。而有其它大于1的值。所以您没办法期望得到以下的结果集:

11 aaaaaaaa

12 bbbbbbb

13 ccccccc

.................

rownum >10 没有记录,由于第一条不满足去掉的话。第二条的ROWNUM又成了1。所以永远没有满足条件的记录。

但假设就是想要用 rownum > 10 这样的条件的话话就要用嵌套语句,把 rownum 先生成。然后对他进行查询。

select *

from (selet rownum as rn,r.* from tbrole r  where ...)

where rn >10

一般代码中对结果集进行分页就是这么干的。

oracle的rownum是在提取记录就已经生成,它先于排序操作。所以必须使用子查询先排序

ROWNUM值的分配是在查询的谓词解析之后,不论什么排序和聚合之前进行的。

所以:若是想分页查询出tbrole中的相应记录,则不须要这样来运行SQL语句

select * from

      (select r.role_id,r.role_name,r.status,to_char(r.create_time,'YYYY-MM-DD HH24:MI:SS') create_time,

              to_char(r.update_time,'YYYY-MM-DD HH24:MI:SS') update_time,r.description,rownum rn from (select * from tbrole
order by  create_time asc) r where 1=1

      and rownum <= 20 )

            where rn >= 1;



而不应该是:

select * from

      (select r.role_id,r.role_name,r.status,to_char(r.create_time,'YYYY-MM-DD HH24:MI:SS') create_time,

              to_char(r.update_time,'YYYY-MM-DD HH24:MI:SS') update_time,r.description,rownum rn from (select * from tbrole ) r where 1=1


      and rownum <= 20 )

            where rn >= 1 order by  create_time asc;



运行顺序:

FROM/WHERE子句先被运行.

依据FROM/WHERE子句输出的行, ROWNUM被分配给他们并自增长.

SELECT 被应用.

GROUP BY 被应用.

HAVING is 被应用.

ORDER BY 被应用

ROWNUM对性能的影响

ROWNUM能够避免oracle在磁盘上进行排序。

rownum无法避免全表扫描的发生。可是它能够避免对整个表数据的排序操作,在指定了rownum后,排序操作在内存中能够轻松完毕。

博客參考资料:http://blog.csdn.net/c04s31602/article/details/5105161

版权声明:本文博客原创文章,博客,未经同意,不得转载。

Oracle在rownum使用结果集排序的更多相关文章

  1. ORACLE中用rownum分页并排序的SQL语句

    ORACLE中用rownum分页并排序的SQL语句 以前分页习惯用这样的SQL语句: select * from (selectt.*,rownum row_num frommytable t ord ...

  2. ORACLE 中rownum和row_number()的使用区别(可指定取sql结果集的第几个数据)

    这篇文章主要介绍了oracle中rownum和row_number()的使用方法以及区别和联系,十分的详细,有需要的小伙伴可以参考下.   row_number()over(partition by ...

  3. oracle之rownum(伪列)

    整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...

  4. oracle 分页(rownum的理解) 以及 树节点的查询

    1:什么是rownum, rownum的生成, rownum相关的符号操作 Rownum是oracle生成结果集时得到的一个伪列, 按照读出行的顺序, 第一条rownum=1, 第二条=2. 对于 O ...

  5. Oracle的rownum原理和使用

    整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...

  6. Oracle的rownum原理和使用(整理几个达人的帖子)

    整理和学习了一下网上高手关于rownum的帖子: 参考资料:  http://tech.ddvip.com/2008-10/122490439383296.html 和 http://tenn.jav ...

  7. Oracle中rownum的基本用法

    Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...

  8. oracle中rownum和row_number()

    row_number()over(partition by col1 order by col2)表示根据col1分组,在分组内部根据col2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内 ...

  9. Oracle中rownum用法警示

    今天调试代码,发现分页查询时使用Oracle中rownum的between......and用法的bug,特此总结: 参考资料:http://blog.csdn.net/lg312200538/art ...

随机推荐

  1. c++日历v1.0版本

    #include<iostream> # include<fstream> #include<time.h> #include<string> #inc ...

  2. 安装numpy、nltk问题汇总

    系统环境是win7(64bit)+python3.4(64bit)+numpy1.82+vs2012 1.假设用sourceforge上编译好的32bit的exe安装,会提示'python versi ...

  3. MapReduce在实际编程“I/O”

    通过本篇MapReduce分析模型.深化MapReduce理解模型:和演示MapReduc进入编程模型是常用格类型和输出格公式,在这些经常使用格外公式,我们能够扩大他们的投入格公式,实例:们须要把Mo ...

  4. kettle 4.4源代码分析Transformation

    1.1. 相关的类和接口 1.1.1. JobEntryTrans 实现了JobEntryInterface的execute()方法,被job运行.由JobEntryTrans实例化Trans,并运行 ...

  5. Java 内存架构

    a)        执行. main()作为该程序的初始线的起点.无论由线程开始在其他线程. JVM有两个内螺纹:守护线程和非守护线程,main()它是一个非守护线程.常由JVM自己使用.java程序 ...

  6. 跑Java -jar somefile.jar时会发生什么(一个)

    最近阅读JVM源代码.一些想法写Blog分享.于是,他开了这么一个新课题. 第一篇文章取名字的时候让我很困惑,我代码的阅读是从Launcher開始入手的,也就是Java.exe(假设是windows平 ...

  7. 使用log4j日志-配置载入问题

    1.在eclipse中,把log4j.properties放在类路径下,在项目启动时就会自己主动载入. 2.在idea中.把log4j.properties放在类路径下,可是项目启动时不能直接载入(原 ...

  8. java 它 引用(基本类型的包装,构造函数和析构函数c++不同)

      一个:java 和c++参考控制 他提到引用,我们会想到java它不喜欢c++里面的指针.当然java内引用和c++里面的引用是不同的. 比如: 比方C++中,我对某一个函数的声明.int a(i ...

  9. WAP页面点击与hover延迟解决之道

    最近一直在WAP端页面的开发,一直都知道wap端点击相关问题存在延迟.之前做的网页大部分使用a链接进行,一直未入此坑. 最近做的一个WAP网站,各种点击,hover事件,如果使用PC端网页的做法,直接 ...

  10. Asp.Netserver控制发展Grid实现(一个)UI转让

    使用Asp.Net办Web开发时间,控制系统提供了,目的,有时很难达到理想的.然后,有几种方法来解决,例如,使用html+js形式,在所需界面的布局的前端,然后通过ajax和其他方式获得的数据.为了实 ...