2

我需要制作一个仅显示可能的大型结果集的子集的导航面板。该子集是结果记录集之前的 20 条记录和之后的 20 条记录。当我通过导航面板导航结果时,我将使用 ROWNUM 应用滑动窗口设计来获取下一个子集。我的问题是 Oracle 的 ROWNUM 在提取您想要的行之前是否构建了整个表?或者它是否足够智能,只生成我需要的行?我用谷歌搜索,我找不到对此的解释。

4

5 回答 5

2

您的解决方案将不起作用(正如 Bob 正确指出的那样),但您可以使用row_number()它来做您想做的事情:

SELECT col1, 
       col2
FROM ( 
   SELECT col1, 
          col2, 
          row_number() over (order by some_column) as rn
   FROM your_table
) t
WHERE rn BETWEEN 10 AND 20

请注意,此解决方案还有一个额外的好处,即您可以根据需要根据不同的标准对最终结果进行排序。

编辑:忘了回答你最初的问题:

使用上述解决方案,是的,Oracle 必须构建完整的结果才能找出正确的编号。

使用 11g 及更高版本,您可以使用查询缓存改进您的查询。

于 2011-12-20T17:35:40.863 回答
2

执行此操作的预分析函数方法是:

select col1, col2 from (
    select col1, col2, rownum rn from (
        select col1, col2 from the_table order by sort_column
      )
      where rownum <= 20
  )
  where rn > 10

在这种情况下,Oracle 优化器将认识到它只需要获取前 20 行即可满足内部查询。它可能必须查看所有行(除非,例如,排序列的索引方式使其完全避免排序),但它不需要对所有行进行完整排序。

于 2011-12-20T18:01:51.457 回答
2

关于问题的标题。

请参阅http://www.orafaq.com/wiki/ROWNUM以及Tom Kyte深入解释。

关于问题的目标。

这应该是您正在寻找的内容:使用 Oracle 进行分页

于 2011-12-20T18:02:46.780 回答
0

我认为你的设计不会像你计划的那样成功。Oracle 按照查询生成的顺序将值分配给 ROWNUM - 生成的第一行分配 ROWNUM=1,第二行分配 ROWNUM=2,等等。请注意,为了分配 ROWNUM=21,查询必须首先返回前二十行,因此如果您编写一个查询

SELECT *
  FROM MY_TABLE
  WHERE ROWNUM >= 21 AND
        ROWNUM <= 40

不会返回任何行,因为为了有 ROWNUM >= 21 的行,查询必须首先返回 ROWNUM <= 20 的所有行。

我希望这有帮助。

于 2011-12-20T17:31:01.610 回答
0

这是一个老问题,但你应该试试这个 - http://www.inf.unideb.hu/~gabora/pagination/results.html

于 2012-08-26T23:27:01.423 回答