ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于rownum

关于rownum

原创 Linux操作系统 作者:jennyliuxu 时间:2010-03-31 09:44:58 0 删除 编辑

1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,
  依此类推,这个伪字段可以用于限制查询返回的总行数。
2、rownum不能以任何基表的名称作为前缀。  

select id,rownum from employee;(在id列上有一个主键索引)
为了完成这个查询,优化器执行一个全索引扫描(主键索引),后跟一个count操作生成每个行的rownum值,
count操作不需要等待得到整个记录集,随着从employee表中返回记录,rownum计数器进行增量,从而确
定每个记录的rownum.

select id,rownum from employee where rownum<10;
为了实施限定条件,优化器用count stopkey操作代替count操作,它将rownum伪列的增量值与限定
条件中指定的值进行比较,如果rownum伪列的值大于限定条件中指定的值,则查询不再返回更多的行!

注意:在where 子句中不能使用 rownum>10这样的操作,只能使用rownum<10这样的操作!

系统是按照记录入库时的顺序给记录排的号,rowid也是顺序分配的

SQL> select rownum,month,sell from sale where rownum=2;(1以上都查不到记录)
SQL> select rownum,month,sell from sale where rownum>5;
(由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件不成立,查不到记录)

如何用rownum实现大于、小于逻辑?(返回rownum在4—10之间的数据)
1. minus操作(速度会受影响)
    select rownum,month,sell from sale where rownum<10
    minus
    select rownum,month,sell from sale where rownum<5;
  
2. 嵌套查询(rownum要取别名)
SELECT r, juchu_no
   FROM (SELECT    ROWNUM r, juchu_no
             FROM ht_d_juchu
         ORDER BY juchu_no)
WHERE r BETWEEN 4 AND 10
注意:
当每一个满足where条件的row被fetch出来,则rownum赋值。但是order by clause是在所有行都fetch出来以后才进行的,此时rownum值在order by以前已经全部都有值。此时再order by, rownum不一定有序了。可以再嵌套一层。

“select * from tabname where rownum<20 order by name" 但却发现oracle却不能按自己的意愿来执行,而是先随便
取20条记录,然后再 order by,后经咨询oracle,说rownum确实就这样,想用的话,只能用子查询 来实现先排序,后
rownum,方法如下:
"select * from (select * from tabname order by name) where rownum<20",但这样一来,效率会较低很多。
后经笔者试验,只需在order by 的字段上加主键或索引即可让oracle先按 该字段排序,然后再rownum;方法不变:
"select * from tabname where rownum<20 order by name"

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23445793/viewspace-630868/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 删除重复记录
请登录后发表评论 登录
全部评论

注册时间:2010-03-07

  • 博文量
    21
  • 访问量
    32009