日期:2014-05-17  浏览次数:20918 次

Oracle分页查询问题。rownum问题。
本帖最后由 w091b 于 2012-12-20 16:28:20 编辑
 -----------这种写法找不出一条数据----------
select my_table.*,rownum from
 (
      select student_id,NAME from student
      union
      select student_id,cno from sc
  )my_table where rownum>10 and rownum<21
------红色字体是不是oracle自带的一种计算条数的变量

------------这种写法就可以查询到结果(10至20条数据)------------
------蓝色字体是什么意思
 select * from 
  (
      select my_table.*,rownum my_rownum from
     (
          select student_id,NAME from student
          union
          select student_id,cno from sc
      )my_table where rownum<21
  )where my_rownum>10
------解决方案--------------------
ROWNUM只适用于小于或小于等于,如果进行等于判断,那么只能等于1,不能进行大于的比较。
ROWNUM的返回很简单,ROWNUM总是从1开始,不管当前的记录是否满足查询结果,ROWNUM返回的值都是1,如果这条记录的值最终满足所有的条件,那么ROWNUM会递加,下一条记录的ROWNUM会返回2,否则下一条记录的ROWNUM仍然返回1。
理解了这一点,就清楚为什么一般的ROWNUM大于某个值或等于某个不为1的值是无法返回结果的,因此对于每条记录的ROWNUM都是1,而ROWNUM为1不满足查询的结果,所以下一条记录的ROWNUM不会递增,仍然是1,因此所有的记录都不满足条件。
------解决方案--------------------
rownum  不是 my_table 中的字段, 可以理解为一个递增的常量。
这样的话,在where 中时取不到rownum 的值的。。。


select * from 
  (
      select my_table.*,rownum my_rownum from
     (
          select student_id,NAME from student
          union
          select student_id,cno from sc
      )my_table where rownum<21
  )where my_rownum>10 

这种写法是间接的把rownum 变成子查询中的一个字段,所以你可以查出来数据

------解决方案--------------------
引用:
引用:
rownum  不是 my_table 中的字段, 可以理解为一个递增的常量。
这样的话,在where 中时取不到rownum 的值的。。。


select * from 
  (
      select my_table.*,rownum my_rownum from
     (
          select student_……



额....rownum   my_rownum , 是 rownum 别名..  间接的变成了子查询的一个字段.. 
------解决方案--------------------
rownum取一个别名 再嵌套一层
------解决方案--------------------
rownumb值从1开始,简单的可以理解,有1,才会有2,依次类推。
所以rounum>=1 ,rounum=1,rownum<=n 都可以返回出数据

而oracle使用rownum分组是利用这个序号将其实例化,如楼主提到的蓝色字体:
rownum my_rownum 这样根据排序字段确定的my_rownum就是固定值,从而可以任意取范围了。