4

可能重复:
Rownum 不使用查询

我正在运行一些测试以了解其rownum工作原理。请有人解释以下查询的输出 - 特别是为什么第三个查询返回 0 行。

查询 1 - 返回 2456 行

Select rownum, s.id, s.title, sv.version_id
from software s JOIN software_version sv on (s.id = sv.id);

查询 2 - 返回 100 行

Select rownum, s.id, s.title, sv.version_id
from software s JOIN software_version sv on (s.id = sv.id)
where rownum between 1 and 100;

查询 3 - 返回 0 行

Select rownum, s.id, s.title, sv.version_id
from software s JOIN software_version sv on (s.id = sv.id)
where rownum between 101 and 400;

谢谢

4

1 回答 1

13

rownum 仅在获取行并评估其他谓词之后才评估。那是关键。所以如果你说 select * from table where rownum >= 2;

它永远无法工作,因为它就像

open cursor loop
  fetch row (rownum is evaluated as the last thing here)
    if fetched then rownum = rownum + 1
end cursor

如果您请求 rownum 从 > 1 开始,那么它永远不会正确。如果你需要做分页,你必须像这样编码

select *
  from (select rownum r, t.*
          from your query tables
         order by ..)
 where r>=101 
   and rownum <= 400

还可以在问汤姆这里阅读更多信息

于 2012-11-12T21:07:23.690 回答