我对 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
这会减慢很多。这是为什么?
为什么你认为这会减慢它的速度?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
this 就等同于(正如 Rob 在评论中所说)rownum <= 9
。
如果您只是想将记录编号在 2 到 10 之间,则无需子查询:
SELECT rownum + 1 AS n, s.*
FROM vzwnet.site_inst s
WHERE rownum < 10