想看排版格式好一点,重点突出点的就直接到我的blog里面去看吧,这里颜色不好标记,就将就一下。很多人都在问这方面的问题,这里我就给大家解释了为什么rownum>N,rownum<N,这些原理是什么,大家看吧,可以讨论。原文网址:http://blog.csdn.net/lovingprince/archive/2008/07/09/2629154.aspxoracle中rownum伪字段用得比较频繁,特别是分页之中,但是由于它的一些特殊性很多人可能并不理解它的实际行为,网络上有很多文章介绍这个 rownum的用法,但是很多都讲得非常模糊,或者就是不太全面,大家看起来也非常痛苦,在这里我将给大家全面讲解一下,希望对大家有所帮助: 首先我们来认识几点rownum的特殊性: 第一、rownum是在记录输出的时候才一步一步的产生的。
第二、rownum始终都是从1开始的。 记住以上两点,基本上你也算是非常了解这个伪字段的用法了,下面我来具体分析一下这些特殊性。我们考察如下的 SQL语句: select * from Test where rownum >=1; select * from Test where rownum >=2; select * from Test where rownum <= 10; 假设Test表有15条记录,这里第一条SQL输出15条记录,第2条SQL输出0条,第3条SQL输出10条记录。 为什么呢?上面我说过了,由于它的特殊性,rownum是在记录输出的时候才产生,所以我们按照下面的步骤来处理: 1)任何在同一条SQL上出现的rownum我们都可以先忽略掉,然后这三条SQL语句都只有select * from Test 2) 我们此时输出记录,当输出第一条记录时,此时oracle会给它安排他的rownum=1,前面也说过了(rownum始终都是从1开始的) 3)这个时候加上rownum的where条件来筛选这条记录是否满足,我们发现,只有第一条SQL和第3条SQL满足rownum>=1和rownum<=10,而第2条SQLrownum>=2,明显不满足,因为输出的第一条记录rownum=1. 4)输出第2条记录,此时第1条SQL和第3条SQL由于前面都有一条满足条件的记录了,此时rownum会安排成2,明显第2条记录也满足需求。我们再来看第2条SQL语句,我们此时输出第2条记录,但是由于之前输出的一条记录被它否决了,即不满足条件,这时的输出的第2条记录rownum仍然等于1,注意了哦,很多人不明白为什么,其实很简单,rownum始终都是从1开始的,只有前面输出了一条满足条件的记录之后,后面的记录rownum才会增加。--简单吧,所以这里对于第2条SQL来讲,他的这个记录rownum还是等于1,又不满足条件。 5)记录处理其他记录。 按照上面的的方法你就可以处理任何关于rownum的sql了,比如: select * from Test where rownum >=1 and id>5 order by id asc; 按照上面的方法,首先去掉rownum,然后剩下 select * from Test where id>5 order by id asc; 这里弄完了会输出结果,然后循环的处理每一条记录,有满足条件的rownum就增加,没有满足条件的记录就不增加。就这么简单。 还有一点要注意,这个rownum的处理过程是针对同一层SQL而言,也就是select 和rownum处于同一个层次才能这么做。如果是嵌套SQL,特殊情况特殊分析。 例如: select * from( select * from Test where id>5 and rownum<=6) t where rownum >=1 order by t.id asc 上面颜色相同的处于同一个层次。
第二、rownum始终都是从1开始的。 记住以上两点,基本上你也算是非常了解这个伪字段的用法了,下面我来具体分析一下这些特殊性。我们考察如下的 SQL语句: select * from Test where rownum >=1; select * from Test where rownum >=2; select * from Test where rownum <= 10; 假设Test表有15条记录,这里第一条SQL输出15条记录,第2条SQL输出0条,第3条SQL输出10条记录。 为什么呢?上面我说过了,由于它的特殊性,rownum是在记录输出的时候才产生,所以我们按照下面的步骤来处理: 1)任何在同一条SQL上出现的rownum我们都可以先忽略掉,然后这三条SQL语句都只有select * from Test 2) 我们此时输出记录,当输出第一条记录时,此时oracle会给它安排他的rownum=1,前面也说过了(rownum始终都是从1开始的) 3)这个时候加上rownum的where条件来筛选这条记录是否满足,我们发现,只有第一条SQL和第3条SQL满足rownum>=1和rownum<=10,而第2条SQLrownum>=2,明显不满足,因为输出的第一条记录rownum=1. 4)输出第2条记录,此时第1条SQL和第3条SQL由于前面都有一条满足条件的记录了,此时rownum会安排成2,明显第2条记录也满足需求。我们再来看第2条SQL语句,我们此时输出第2条记录,但是由于之前输出的一条记录被它否决了,即不满足条件,这时的输出的第2条记录rownum仍然等于1,注意了哦,很多人不明白为什么,其实很简单,rownum始终都是从1开始的,只有前面输出了一条满足条件的记录之后,后面的记录rownum才会增加。--简单吧,所以这里对于第2条SQL来讲,他的这个记录rownum还是等于1,又不满足条件。 5)记录处理其他记录。 按照上面的的方法你就可以处理任何关于rownum的sql了,比如: select * from Test where rownum >=1 and id>5 order by id asc; 按照上面的方法,首先去掉rownum,然后剩下 select * from Test where id>5 order by id asc; 这里弄完了会输出结果,然后循环的处理每一条记录,有满足条件的rownum就增加,没有满足条件的记录就不增加。就这么简单。 还有一点要注意,这个rownum的处理过程是针对同一层SQL而言,也就是select 和rownum处于同一个层次才能这么做。如果是嵌套SQL,特殊情况特殊分析。 例如: select * from( select * from Test where id>5 and rownum<=6) t where rownum >=1 order by t.id asc 上面颜色相同的处于同一个层次。
解决方案 »
- 请教高手:JPA 如何映射 boolean ?J
- 双击一个控件弹出一个Frame,能不能像C#中的showdialog那样只有等弹出的Frame关闭了,程序能继续往下走.
- 如何用JAVA 将GIF动画图缩小比例而不失去动画效果?
- 初来CSDN ,散分给大哥们!!
- 请问“jcreator"这个软件在那下载?
- 这段话有些地方看不懂?
- 很想了解JBuilder的实现原理,对源代码有所研究的请进。
- 下载文本文件后,页面报错
- 我的这个JSP为什么在tomcat下找不到自定义的类
- websphere 中如何设置搜索bean的路径
- 怎么写一个自己的安全管理器,它判断用户的密码是否正确,如果正确就可以读写文件。大侠们帮忙
- 嘿嘿!
oracle要总结了;