2012-03-13 60 views
6

我有以下查詢:爲什麼=運算符不適用於ROWNUM,而不適用於值1?

select * from abc where rownum = 10 

輸出:沒有記錄顯示

我肯定有超過25次的記錄在ABC臺,我的目標是要顯示的第n個記錄。

如果我寫的查詢爲: -

select * from abc where rownum = 1 

它工作正常,給我的第一條記錄。除第一個以外,沒有任何其他記錄。

有什麼想法?

回答

18

由於行號順序分配給該被取出返回的行。

這裏是你的這種說法是如何工作的。它抓住第一個候選行並暫時給它第1行,這不符合你的條件,因此它被扔掉。

然後你得到第二個候選行和也給行號1(因爲前一個被棄如敝屣)。它也不匹配。

那麼第三個候選行......好吧,我相信你能看到,這是走了。總之,你永遠不會找到滿足該條件的行。

行號僅用於= 1< something<= something

這在Oracle docs for the rownum pseudo-column所有解釋。

你也應該記住,SQL是,除非你指定的順序,返回無序集的關係代數。這意味着第10行可能是現在和三分鐘內的其他內容。

如果你想有一個(缺憾,誠然)的方式獲得n個行,可以使用類似(第五行):

select * from (
    select * from (
     select col1, col2, col3 from tbl order by col1 asc 
    ) where rownum < 6 order by col1 desc 
) where rownum = 1 

內選擇將確保你有一個一致的順序在開始扔掉行之前,在查詢之前,中間選擇將丟棄除前五行之外的所有行,並且也顛倒順序。

外部選擇,然後將只返回翻轉後的第一行(這是五行集時,它是按升序排列的最後一行)。

一個更好的方法可能是:

select * from (
    select rownum rn, col1, col2, col3 from tbl order by col1 
) where rn = 5 

這是通過獲取的一切,分配給ROWNUM一個「真正的」一欄,然後使用真正的列數來篩選結果。

+0

非常感謝。你能否建議任何替代方案來達到我的目標?也就是說,如果我知道n的值,顯示第n條記錄? – 2012-03-13 06:08:43

+0

非常感謝。Oracle文檔說:UPDATE my_table SET column1 = ROWNUM; 更好的是,我將在表中創建一個真正的列,然後用此過濾結果。 :) – 2012-03-13 06:17:21

+1

@SaharHassan,唯一的問題是你需要維護它。換句話說,你可能必須有觸發器或自動增量列。但是,除非您明確命令它們,否則這些都不會有助於事實,即結果集本身就是_unsorted_。 – paxdiablo 2012-03-13 06:20:31

相關問題