2013-06-22 88 views
0

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 

這會慢下來很多。這是爲什麼?

回答

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

你有沒有睡覺?我想我有機會在深夜回答一些SQL問題,但是NOOOOO。 ;) –

+6

另外:1)沒有ORDER BY子句的rownum沒有意義。 2)正確性第一,表現第二! – LoztInSpace

+0

取決於作者的意圖。如果意圖獲取特定的行,沒有ORDER BY就沒有意義。但如果意圖只是標記返回的行,那就不同了。所提出的問題沒有具體說明意圖。這個解決方案只是標記行,在這種情況下不需要子查詢。將ORDER BY添加到內部查詢中,意義發生變化,這會更有意義。 – Glenn

1

如果你只是希望2和10之間的號碼您的記錄,也沒有必要到子查詢:

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