关于oracle分页中的rownum

来源:互联网 发布:男士形象设计软件下载 编辑:程序博客网 时间:2024/05/01 16:58

前几天做分页都是很简单的select * ,用的语句是

select * from md_archive t where (rowid not in(select rowid from md_archive where rownum<5)and rownum<=5)  order by id.

今天要用到条件查询了.测试了下上述语句不能用条件查询,或者说是比较复杂(因为 not in的存在).以下两个语句都可以插入条件,但是问题随之而来.

1.SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM md_archive order by id) A WHERE ROWNUM <= 10 and archno like '%m%' order by id) WHERE RN >= 5 order by id

 

2.select * from (select f.*,  rownum rn from md_archive f where rownum<=10 and archno like '%m%' order by id) where rn>=5 order by id

 

两者的查询结果不一样.奥妙在哪里呢?就在select  rownum的过程上.

语句1中,第一个select中是没有rownum这个字段.在第二个SELECT A.*, ROWNUM RN FROM中才形成了rownum.因为在最里层的SELECT * FROM md_archive order by id中已经按id排序过,第二层形成rownum时是按order by id后的顺序依次递增.在语句2中.由于已经在最里层形成了rownum,而且还是在order by id之前,结果就造成第二层select的时候不是按id顺寻取记录,两者结果自然不一样了.测试如下图所示.(注意rn)

语句一,二层select后的结果

语句二,最里层select后的结果