参考:http://www.blogjava.net/conans/articles/219693.html

参考:http://www.blogjava.net/freeman1984/archive/2011/01/20/343253.html

rowid 和 rownu : http://www.2cto.com/database/201308/234809.html

  对于 Oracle 的 rownum 问题,原始SQL不支持>,>=,=(除=1外),between...and,只能用以上符号(<、<=),!=的话也会有些问题,经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来,其实您只要理解好了这个 rownum 伪列的意义就不应该感到惊奇。

  ROWNUM是一种伪列,它会根据返回记录生成一个序列化的数字。利用ROWNUM,我们可以生产一些原先难以实现的结果输出,但因为它是伪列的这个特殊性,我们在使用时也需要注意一些事项,不要掉入“陷阱”。下面就介绍一下它的使用技巧及注意事项。

1、常用方式总结

  1.1 TOP N 结果

   这个比较简单,但如果你希望对一个排序结果取Top N数据的话,使用ROWNUM存在一些“陷阱”,我们后面部分会介绍这些“陷阱”并且说明如何避免。

 sql> select * from t_test4

   2  where rownum <= 5;

 USERNAME                          USER_ID CREATED

 ------------------------------ ---------- ---------

 WOW                                    71 26-APR-07

 CS2                                    70 15-JAN-07

 3                                      69 01-NOV-06

 DMP                                    68 12-OCT-06

 PROFILER                               67 05-SEP-06

  1.2 分页查询,下面返回结果中的第10到第15条记录:

 select * from (
selelct s.*,rownum rn from t_student s
where rownum <= 15 order by s.create_time,s.id
) a
where a.rn >10
 select * from (
select s.*,rownum from t_student s
order by s.create_time,s.id
) a
where a.rownum bettween 10 and 15;

 1.3

--select a.class_date,rownum,a.start_time,b.class_date,b.minson
select decode(rownum-b.minson,0,a.class_date,null),decode(rownum-b.minson,0,1,rownum+1-b.minson) sno,a.start_time
from
( select class_date,start_time from t_class order by class_date,start_time ) a,
( select class_date,min(rownum) as minson from (select * from t_class order by class_date,start_time) group by class_date ) b
where a.class_date=b.class_date
order by a.class_date;

select decode(rownum-b.minson,0,a.class_date,null),decode(rownum-b.minson,0,1,rownum+1-b.minson) sno,a.start_time
from
( select class_date,min(rownum) as minson from (select * from t_class order by class_date,start_time) group by class_date ) b
left join
( select class_date,start_time from t_class order by class_date,start_time ) a
on a.class_date=b.class_date;

3  ROWNUM的使用“陷阱”

由于ROWNUM是一个伪列,只有有结果记录时,ROWNUM才有相应数据,因此对它的使用不能向普通列那样使用,否则就会陷入一些“陷阱”当中。

  3.1     对ROWNUM进行>、>=、=操作

  不能对ROWNUM使用>(大于1的数值)、>=(大于或等于1的数值)、=(大于或等于1的数值),否则无结果

这是因为:

1、ROWNUM是伪列,有了 满足查询条件后的返回结果 之后,每条返回记录就会对应产生一个ROWNUM数值;

2、返回结果记录的ROWNUM是从1开始排序的,因此第一条始终是第一条;

 sql> select BL_REF_CDE, rownum rn from css_bl_view where rn > 1;    -无结果记录

最新文章

  1. 与你相遇好幸运,aglio写接口文档
  2. mysql 替换某个字段中的某个字符
  3. 《构建之法》8&amp;16
  4. 学习_单片机/嵌入式_的资源链接。——Arvin
  5. factory service provide自定义服务
  6. 【洛谷P3143】Diamond Collector
  7. C语言 malloc()与sizeof运算的盲点
  8. 数据库多对多关联表(Python&amp;MySQL)
  9. tomcat下jndi配置
  10. python--列表生成式--8
  11. 23.allegro中自动布线[原创]
  12. 动态的加载显示oracle警告日志文件内容
  13. 实现MongoDB读写分离的“读偏好”介绍
  14. 学习go语言编程系列之定义变量
  15. Jquery仿百度经验左右滚动切换效果(转)
  16. 初识Telerik for AJAX
  17. 转载-vim配置收藏
  18. Delphi如何找到出错行的行数!!
  19. od 转储 二进制文件常用命令
  20. Windbg找出memory leak的一种笨办法

热门文章

  1. [转] Hibernate与 MyBatis的比较
  2. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)
  3. [转]Oracle connection strings
  4. iOS:手势的详解UIGestureReconizer
  5. TCP-滑动窗口概念
  6. 自定义标签(JspFragment类、invoke方法、开发带属性的标签)
  7. PhpStorm 对 AngularJS 的支持
  8. POJ 2664 Prerequisites?(简单题)
  9. AWK 怎么读取标准输入(STDIN)
  10. TestNG 七 annotation