首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >(Oracle)使用分页查询时如何获取结果总数?

(Oracle)使用分页查询时如何获取结果总数?
EN

Stack Overflow用户
提问于 2010-05-25 21:46:59
回答 4查看 42.7K关注 0票数 24

我使用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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2905199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档