欢迎投稿

今日深度:

Oracle中rownum在结果集中排序的使用,oraclerownum

Oracle中rownum在结果集中排序的使用,oraclerownum


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, 只要是用小于号,查出来的结果很容易地与一般理解在概念上能达成一致,应该不会有任何疑问的。

先好好理解 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



怎用“rownum”在Oracle排序后结果集取指定记录

select formatted_entry from (select row_number()over(order by to_number(product_code),sample_number) rn,a.* from sample a where ...)
where rn=i_Batch_No;

为什么不可以?
 

对于oracle中使用rownum的问题

除了索引组织表(IOT),其他的表存储都是堆表(Heap表)是无序的,查询出的数据不一定就是入库顺序,切记
所以 用rownum 最好加上order by
解决方案:
查询:
select * from table_a where
rowid in ( select rowid from table_a where rownum <= 2000 order by id)
删除:
delete from table_a where
rowid in ( select rowid from table_a where rownum <= 2000 order by id)
这里按照id 排序,因为id是有索引的,索引本身就是有序的,所以 order by id 不会产生性能问题
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4083.html NewsArticle Oracle中rownum在结果集中排序的使用,oraclerownum Oracle中rownum在结果集中排序的使用 对于 Oracle 的 rownum 问题,很多资料都说不支持,=,=,between...and,只能用以上符号(、=、!=),并非说用,=,=...
评论暂时关闭