ROWNUM我haae這個怪癖與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
這會慢下來很多。這是爲什麼?
ROWNUM我haae這個怪癖與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不一定實例化子查詢。
有兩個原因需要用子查詢編寫。首先,您不能使用from
子句中的select
子句中定義的變量。要做到這一點,你需要子查詢。第二個是你不能說where rownum between 2 and 10
。當從select
返回數據時,設置值爲rownum
。如果沒有第一行返回,則第二行不會出現。
如果你關心性能,你可以這樣做:
select *
from (select rownum n, t.*
from table t
where rownum <= 10
)
where n between 2 and 10
編輯:
使用rownum
沒有order by
返回行的任意一組,這可能從一個執行變化到下一個。它不會返回一個「隨機」集合(這是很難做到的)。它可能似乎返回插入到表中的第一行,但不能保證。
我在這種形式下離開解決方案,因爲問題是關於「沒有返回行」而不是返回哪些行。但是,如果沒有order by
,則這與(0123)在rownum <= 9
中相當(如Rob在評論中所述)。
如果你只是希望2和10之間的號碼您的記錄,也沒有必要到子查詢:
SELECT rownum + 1 AS n, s.*
FROM vzwnet.site_inst s
WHERE rownum < 10
你有沒有睡覺?我想我有機會在深夜回答一些SQL問題,但是NOOOOO。 ;) –
另外:1)沒有ORDER BY子句的rownum沒有意義。 2)正確性第一,表現第二! – LoztInSpace
取決於作者的意圖。如果意圖獲取特定的行,沒有ORDER BY就沒有意義。但如果意圖只是標記返回的行,那就不同了。所提出的問題沒有具體說明意圖。這個解決方案只是標記行,在這種情況下不需要子查詢。將ORDER BY添加到內部查詢中,意義發生變化,這會更有意義。 – Glenn