前几天做分页都是很简单的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后的结果