0

我对 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

这会减慢很多。这是为什么?

4

2 回答 2

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 bythis 就等同于(正如 Rob 在评论中所说)rownum <= 9

于 2013-06-22T03:05:37.353 回答
1

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

SELECT rownum + 1 AS n, s.*
  FROM vzwnet.site_inst s
  WHERE rownum < 10
于 2013-06-22T03:59:23.317 回答