我需要制作一个导航面板,仅显示可能的大结果集的子集。此子集之前是20个记录,结果记录集之后是20个记录。当我通过导航面板导航结果时,我将使用ROWNUM应用滑动窗口设计来获取下一个子集。我的问题是Oracle的ROWNUM在提取你想要的行之前是否构建了整个表?或者它是否足够智能,只能生成我需要的行?我用谷歌搜索,我无法找到解释。
答案 0 :(得分: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及以上版本,您可以使用query cache改进查询。
答案 1 :(得分: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行以满足内部查询。它可能必须查看所有行(除非,例如,排序列的索引方式允许它完全避免排序)但它不需要对所有行进行完整排序。
答案 2 :(得分:2)
关于问题的标题。
请参阅http://www.orafaq.com/wiki/ROWNUM和this Tom Kyte的深入解释。
关于问题的目标。
这应该是您正在寻找的内容:Paging with Oracle
答案 3 :(得分:0)
我认为你的设计不会按照你的计划完成。 Oracle按照查询生成的顺序将值分配给ROWNUM - 生成的第一行分配ROWNUM = 1,第二行分配ROWNUM = 2等。请注意,为了分配ROWNUM = 21,查询必须首先返回前20行,因此如果你写了一个说
的查询SELECT *
FROM MY_TABLE
WHERE ROWNUM >= 21 AND
ROWNUM <= 40
不会返回任何行,因为为了存在ROWNUM&gt; = 21的行,查询必须首先返回ROWNUM&lt; = 20的所有行。
我希望这会有所帮助。
答案 4 :(得分:0)
这是一个老问题,但你应该试试这个 - http://www.inf.unideb.hu/~gabora/pagination/results.html