Oracle 分页

详解Oracle的几种分页查询语句:[url]http://database.51cto.com/art/200904/118737.htm[/url]
ORACLE大数据量下的分页解决方法:[url]http://ddkangfu.blog.51cto.com/311989/1425797/[/url]
oracle 分页数据重复数据不正确:[url]https://my.oschina.net/u/852445/blog/402325[/url]
实例:
SELECT * 
FROM
(
SELECT RS.AMOUNT,RS.AREA,RS.AREANAME,[color=red]ROWNUM rn
FROM
(
SELECT (
CASE
WHEN oy.AMOUNT IS NULL THEN
ny.AMOUNT-0
WHEN ny.AMOUNT IS NULL THEN
0-oy.AMOUNT
ELSE
ny.AMOUNT-oy.AMOUNT
END) AS amount,NY.AREA,NY.areaName
FROM
(SELECT "SUM"(VI.AMOUNT) AS AMOUNT ,VI.AREA, dm.AREA_NAME as areaName FROM VI_INCOME_ITEM_MAPPING VI
LEFT JOIN DM_AREA dm ON VI.AREA = dm.AREA_CODE
WHERE VI.T_ITEM = #{BudgetTItem,jdbcType=VARCHAR} AND VI.BLEVEL ='3'
AND "SUBSTR"(VI.TXN_DATE,1,6) <![CDATA[ >= ]]> #{startMonth,jdbcType=VARCHAR}
AND "SUBSTR"(VI.TXN_DATE,1,6) <![CDATA[ <= ]]> #{endMonth,jdbcType=VARCHAR}
GROUP BY VI.AREA,dm.AREA_NAME) ny
LEFT JOIN
(SELECT "SUM"(VI.AMOUNT) AS AMOUNT ,VI.AREA, dm.AREA_NAME as areaName FROM VI_INCOME_ITEM_MAPPING VI
LEFT JOIN DM_AREA dm ON VI.AREA = dm.AREA_CODE
WHERE VI.T_ITEM = #{BudgetTItem,jdbcType=VARCHAR} AND VI.BLEVEL ='3'
AND "SUBSTR"(VI.TXN_DATE,1,6) <![CDATA[ >= ]]> #{lastStartMonth,jdbcType=VARCHAR}
AND "SUBSTR"(VI.TXN_DATE,1,6) <![CDATA[ <= ]]> #{lastEndMonth,jdbcType=VARCHAR}
GROUP BY VI.AREA,dm.AREA_NAME) oy
ON NY.AREA = OY.AREA
ORDER BY amount DESC ) [color=red]rs WHERE ROWNUM <= 10) WHERE rn >0

[color=blue]
注意红色字体内层用ROWNUM,外层用RN,Oracle 一般第一次select时,有ROWNUM,可在第二层分页
[/color]
分页两种方法:
第一种:
SELECT * FROM (SELECT t.*,ROWNUM as rowno FROM (SELECT * FROM test ORDER BY ADD_TIME ) t )
WHERE rowno BETWEEN 200001 AND 300000;

第二种:
SELECT * FROM ( SELECT t.*,ROWNUM as rowno FROM (SELECT * FROM test ORDER BY ADD_TIME) t WHERE ROWNUM  <= 300000)
WHERE rowno >=200001

第二种比第一种有效,因为第二种锁定了分页结果集,而第一种是从表所有记录中,分页;
对于两层嵌套的分页查询如:
实例:
select (select * from test ORDER BY ADD_TIME) where ROWNUM between 100000 and 200000

对于含排序(ORDER BY ADD_TIME), 则排序字段ADD_TIME字段必须是唯一索引,否则已出现
结果集为空,或数据重复,含排序的正确做法如上面两种分页方式,再加一层嵌套。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值