你好,游客 登录 注册 搜索
背景:
阅读新闻

使用rowid和rownum获取记录时要注意的问题

[日期:2014-10-20] 来源:Linux社区  作者:aaron8219 [字体: ]

同样的,当我们要获取后5条记录,即5<rownum<11的记录,直接使用以下查询是获取不到值的:


SQL> select rownum,object_id,object_name from test1 where rownum>5 and rownum <11;


no rows selected


为什么呢?原因刚才已经解释过了,由于rownum>5中首先就排除掉了rownum=1这条记录,因此就直接丢弃这些行,也就没有返回结果了,也就是一直去找row number 1,但永远也找不到(因为被条件排除掉了),即使把rownum<11这个条件写在前面,结果也是一致的,注意这里连接条件用的是and,如果用or那就相当于把rownum>5这个条件忽略了,是会有结果的


SQL> select object_id,object_name from test1 where rownum<11 or rownum>5;


 OBJECT_ID OBJECT_NAME
---------- ------------------------------
        20 ICOL$
        44 I_USER1
        28 CON$
        15 UNDO$
        29 C_COBJ#
        3 I_OBJ#
        25 PROXY_ROLE_DATA$
        39 I_IND1
        51 I_CDEF2
        26 I_PROXY_ROLE_DATA$_1


10 rows selected.

 

即使使用between ... and ...也是不行的,看执行结果:


SQL> select object_id,object_name from test1 where rownum between 0 and 5;


 OBJECT_ID OBJECT_NAME
---------- ------------------------------
        20 ICOL$
        44 I_USER1
        28 CON$
        15 UNDO$
        29 C_COBJ#


SQL> select object_id,object_name from test1 where rownum between 1 and 5;


 OBJECT_ID OBJECT_NAME
---------- ------------------------------
        20 ICOL$
        44 I_USER1
        28 CON$
        15 UNDO$
        29 C_COBJ#


SQL> select object_id,object_name from test1 where rownum between 6 and 10;

 

no rows selected


between0和1都是包含有rownum=1的,因此有结果,而between 6就相当于直接rownum>5,把rownum=1排除掉了,所以就无结果

 

由于rownum的这个伪列的特殊性,因此在我们书写SQL语句时,尤其是写分页代码的时候,必须使用子查询来获取后5条记录,如:


SQL> select b.object_id,b.object_name from (select rownum rn,a.* from test1 a where rownum<11) b where rn>5;


 OBJECT_ID OBJECT_NAME
---------- ------------------------------
        3 I_OBJ#
        25 PROXY_ROLE_DATA$
        39 I_IND1
        51 I_CDEF2
        26 I_PROXY_ROLE_DATA$_1


当然,我们也可以用rowid来直接获取后5条记录,因为rowid没有rownum那样的特殊要求,但实际操作起来,是非常不方便的,实际环境中也没有这样的用法,rowid难以记忆也不方便书写


SQL> select object_id,object_name from test1 where rowid>to_char('AAAM+rAAGAAAACUAAE') and rowid<=to_char('AAAM+rAAGAAAACUAAJ');


 OBJECT_ID OBJECT_NAME
---------- ------------------------------
        3 I_OBJ#
        25 PROXY_ROLE_DATA$
        39 I_IND1
        51 I_CDEF2
        26 I_PROXY_ROLE_DATA$_1


总结:


rowid通常不直接用于SQL代码中,主要是给索引使用的,通过索引查找rowid,再更具rowid回表取数据,使Oracle数据库完成高效的数据检索,而rownum则经常用在数据库的应用代码中,尤其是对分页数据的过滤,但使用的时候必须要注意rownum的特性,切忌跳过对rownum=1的获取而造成无结果集的问题

更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址http://www.linuxidc.com/Linux/2014-10/108251.htm

linux
相关资讯       rowid  Rownum 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款