rownum的问题

时间:2011-06-22 14:11:56

标签: sql oracle11g

我有一个查询

select * from tablename where rownum =1;

此查询提供了所需的结果,但如果我运行

select * from tablename where rownum=2;

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

2 个答案:

答案 0 :(得分:5)

由于ROWNUM的分配方式,谓词WHERE rownum=2永远不会成立。例如,如果表中有5行,则算法类似于

  • 从表中检索第一行。为它指定一个1的rownum。
  • 针对谓词检查此rownum,弃掉
  • 从表中检索第二行。为它指定一个1的rownum。
  • 针对谓词检查此rownum,弃掉
  • 从表中检索第三行。为它指定一个1的rownum。
  • 针对谓词检查此rownum,弃掉
  • 从表中检索第四行。为它指定一个1的rownum。
  • 针对谓词检查此rownum,弃掉
  • 从表中检索第五行。为它指定一个1的rownum。
  • 针对谓词检查此rownum,弃掉

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

SELECT *
  FROM table_name
 WHERE rownum <= 2

将返回2行。

如果您尝试识别表格中的“第二行”,则可能需要类似

的内容
SELECT *
  FROM (SELECT t.*,
               rank() over (order by some_column) rnk
          FROM table_name)
 WHERE rnk = 2

答案 1 :(得分:1)

我不认为这是一个定义明确的查询:

  

ROWNUM是一个伪列,它返回结果中行的位置   组。 ROWNUM在记录后进行评估   从数据库中选择   在执行ORDER BY之前   子句。