oracle默认获取最后页,sql – (Oracle)使用分页查询时如何获取总结果?

我正在使用Oracle 10g和以下范例来获取一段时间的15个结果页面(这样当用户查看搜索结果的第2页时,他们会看到记录16-30).

select *

from

( select rownum rnum, a.*

from (my_query) a

where rownum <= 30 )

where rnum > 15;

现在我需要运行一个单独的SQL语句来对“my_query”执行“select count”,以获取my_query的总结果数(以便我可以将它显示给用户并使用它来计算出总页数等).

有没有办法通过第二个查询,即从上面的查询获取结果的总数,而不是这样做?我已经尝试添加“max(rownum)”,但它似乎不起作用(我收到一个错误[ORA-01747],似乎表明它不像我在组中的关键字rownum).

我想要从原始查询获取这个原理而不是在单独的SQL语句中执行的理由是“my_query”是一个昂贵的查询,所以我宁愿不运行它两次(一次获得计数,一次获得数据页)如果我没有;但是无论如何,如果可能的话,如果有任何额外的开销,我可以想出从单个查询中获取结果的数量(同时获取我需要的数据页面).请指教.

这正是我想要做的,因为我收到一个ORA-01747错误,因为我相信它不像我在组中有ROWNUM.注意,如果有另外一个解决方案不使用max(ROWNUM),但是别的东西,这也是非常好的.这个解决方案是我第一个想到可能会起作用的.

SELECT * FROM (SELECT r.*, ROWNUM RNUM, max(ROWNUM)

FROM (SELECT t0.ABC_SEQ_ID AS c0, t0.FIRST_NAME, t0.LAST_NAME, t1.SCORE

FROM ABC t0, XYZ t1

WHERE (t0.XYZ_ID = 751) AND

t0.XYZ_ID = t1.XYZ_ID

ORDER BY t0.RANK ASC) r WHERE ROWNUM <= 30 GROUP BY r.*, ROWNUM) WHERE RNUM > 15

———编辑——–

请注意,根据第一个评论,我尝试了以下似乎有效的内容.我不知道它的表现与其他解决方案的效果(我正在寻找解决方案,以满足我的需求,但表现最好).例如,当我运行它需要16秒.当我拿出COUNT(*)OVER()RESULT_COUNT时,只需要7秒钟:

SELECT * FROM (SELECT r.*, ROWNUM RNUM, )

FROM (SELECT COUNT(*) OVER () RESULT_COUNT,

t0.ABC_SEQ_ID AS c0, t0.FIRST_NAME, t1.SCORE

FROM ABC t0, XYZ t1

WHERE (t0.XYZ_ID = 751) AND t0.XYZ_ID = t1.XYZ_ID

ORDER BY t0.RANK ASC) r WHERE ROWNUM <= 30) WHERE RNUM > 1

解释计划从进行排序(ORDER BY STOP KEY)改变为执行WINDOW(排序).

之前:

SELECT STATEMENT ()

COUNT (STOPKEY)

VIEW ()

SORT (ORDER BY STOPKEY)

NESTED LOOPS ()

TABLE ACCESS (BY INDEX ROWID) XYZ

INDEX (UNIQUE SCAN) XYZ_ID

TABLE ACCESS (FULL) ABC

后:

SELECT STATEMENT ()

COUNT (STOPKEY)

VIEW ()

WINDOW (SORT)

NESTED LOOPS ()

TABLE ACCESS (BY INDEX ROWID) XYZ

INDEX (UNIQUE SCAN) XYZ_ID

TABLE ACCESS (FULL) ABC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值