在公司调试一个BUG时遇到的一个问题,同事写的SQL语句:
select b.* from (
select a.*,ROWNUM RN from ( select * from ( select查询语句(结果) order by 某个字段或别名 ))a where ROWNUM<=?) b where RN>?
在显示每页结果时,虽然能显示数据但显示的数据会重复甚至部分数据不能显示(注: select查询语句(结果)能完整查询出来,显示没问题)
后来上网查资料,网上部分人给的语句也是这样:
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21顿时晕了莫非没错,于是直接查 ORACLE中ROWNUM原理,
原来是在ORACLE中,分页是由ROWNUM来实现的。ROWNUM存在使用规则,在单个子查询中,对于WHERE中的ROWNUM限制只能使用<或者<=,
其实不是不能用,而是最好不要直接在查询ROWNUM那里用WHERE。
可以改成这样:
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN >= 21andRN <= 40 这样查询出来的结果就没什么问题了。