zoukankan      html  css  js  c++  java
  • Oracle在rownum使用结果集排序

    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


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

  • 相关阅读:
    K&R C C90,C99的改进
    Windows 用来定位 DLL 的搜索路径
    常量字符串的问题
    C++0x中一些有用的新特性
    mainfest机制
    mainfest机制
    C++0x中一些有用的新特性
    c语言目标程序中的段
    c语言目标程序中的段
    数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4752282.html
Copyright © 2011-2022 走看看