在oracle中使用rownum作为条件查询数据时,出现数据查找不到的问题
原因就是rownum是在数据进行一条一条语句的扫描出现的,所以只能使用“小于”,“小于等于符号”
使用“等于”,"大于“符号都不行,因为这时候语句不是从第一条开始一条一条扫描的,故而无法对每条语句产生rownum,也就无法用rownum做条件了。
解决方案:
采用子查询解决
比如上方的sql语句
select * from t_owners where rownum>2 and rownum<5
改为:
- select * from (select rownum r,t. * from t_owners t where rownum <5)
- where r>2
即可查询到数据,问题解决。(会先执行子查询中的语句,产生rownum)
注意:需要给rownum起别名,在外层使用,要保证使用的rownum是子查询中已经产生的rownum。
如果需求是排序后分页查询,可使用 RANK、DENSE_RANK 、ROW_NUMBER 这三个函数,这三个函数又有点区别。
RANK:相同的值排名相同,排名跳跃
DENSE_RANK :相同的值排名相同,排名连续
ROW_NUMBER :返回连续的排名,无论值是否相等
以ROW_NUMBER进行举例:
- select * from (select row_number() over (order by money desc) rpwn,money from t_owners)
- where rpwn >2