我使用Oracle10g和下面的范例,一次获得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,这似乎表明它不喜欢我在group by中使用关键字rownum)。
我希望从原始查询而不是在单独的SQL语句中执行此操作的理由是,"my_query“是一个开销很大的查询,因此如果没有必要,我宁愿不运行它两次(一次用于获取计数,一次用于获取数据页);但是,如果可能的话,无论我想出什么解决方案来从单个查询中获取结果的数量(同时获取所需的数据页),都不应该增加太多额外的开销。请给我建议。
这正是我正在尝试做的事情,我收到了一个ORA-01747错误,因为我相信它不喜欢我在group by中有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
- EDIT -注意,根据第一条评论,我尝试了以下似乎有效的评论。我不知道它与其他解决方案相比有多好(我正在寻找满足我需求但性能最好的解决方案)。例如,当我运行这段代码时,需要16秒。当我在() 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)改为执行窗口( SORT )。
之前:
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
https://stackoverflow.com/questions/2905199
复制相似问题