我用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
这会减慢它的速度。那是为什么?
答案 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