查询中的rownum问题

时间:2013-06-22 03:01:53

标签: sql database oracle

我用rownum来讨论这个怪癖:

select rownum as n, s.* from vzwnet.site_inst s where n between 2 and 10 --> dones not work

我必须把它作为:

select * from (select rownum n, t.* from table t) where n between 2 and 10

这会减慢它的速度。那是为什么?

2 个答案:

答案 0 :(得分:10)

为什么你认为这会减慢速度? Oracle不一定实例化子查询。

您必须使用子查询编写它有两个原因。首先,您不能使用select子句中from子句中定义的变量。为此,您需要子查询。

第二个是你不能说where rownum between 2 and 10。从rownum返回数据时设置select的值。如果没有返回第一行,则第二行永远不会出现。

如果您担心表现,可以这样做:

select *
from (select rownum n, t.*
      from table t
      where rownum <= 10
     )
where n between 2 and 10

编辑:

在没有rownum的情况下使用order by会返回一组任意行,这些行可能会因执行而异。它不会返回“随机”集(这很难做到)。它似乎可以返回插入表中的第一行,但这不能保证。

我将以此形式离开解决方案,因为问题是“不返回任何行”而不是返回哪些行。但是,如果没有order by,这与rownum <= 9相同(正如Rob在评论中所述)。

答案 1 :(得分:1)

如果您只想在2到10之间对记录进行编号,则无需子查询:

SELECT rownum + 1 AS n, s.*
  FROM vzwnet.site_inst s
  WHERE rownum < 10