rownum的问题

fac*_*ook 0 sql oracle11g

我有一个问题

select * from tablename where rownum =1;
Run Code Online (Sandbox Code Playgroud)

此查询给出了所需的结果,但如果我运行

select * from tablename where rownum=2;
Run Code Online (Sandbox Code Playgroud)

然后此查询给出null结果.知道为什么吗?

Jus*_*ave 5

WHERE rownum=2由于ROWNUM的分配方式,谓词永远不会成立.例如,如果表中有5行,那么算法就会像

  • 从表中检索第一行.将其分配为1的rownum.
  • 根据谓词检查此rownum,丢弃
  • 从表中检索第二行.将其分配为1的rownum.
  • 根据谓词检查此rownum,丢弃
  • 从表中检索第三行.将其分配为1的rownum.
  • 根据谓词检查此rownum,丢弃
  • 从表中检索第四行.将其分配为1的rownum.
  • 根据谓词检查此rownum,丢弃
  • 从表中检索第五行.将其分配为1的rownum.
  • 根据谓词检查此rownum,丢弃

由于结果集中没有"第一行",因此不能存在"第二行".您可以在不等式比较中使用ROWNUM,即

SELECT *
  FROM table_name
 WHERE rownum <= 2
Run Code Online (Sandbox Code Playgroud)

将返回2行.

如果你试图识别表中的"第二行",你可能想要类似的东西

SELECT *
  FROM (SELECT t.*,
               rank() over (order by some_column) rnk
          FROM table_name)
 WHERE rnk = 2
Run Code Online (Sandbox Code Playgroud)