2011-06-22 54 views
0

我有一個查詢問題的rownum

select * from tablename where rownum =1; 

這個查詢是給想要的結果,但如果我跑

select * from tablename where rownum=2; 

則該查詢給空的結果。 任何想法爲什麼?

+3

確定,沒有與ROWNUM = 2行? – TcKs

+0

是的,表中有2行。 – facebook

+0

是的,我從http://stackoverflow.com/questions/3457370/select-rownum-from-salary-where-rownum-3 – facebook

回答

1

我不認爲這是一個良好定義的查詢:

ROWNUM是一個僞列返回的結果集 一排的位置。在執行ORDER BY 條款之前,從數據庫中選擇記錄 並且在 之後評估ROWNUM。

5

由於ROWNUM的分配方式,謂詞WHERE rownum=2永遠不會成立。例如,如果表格中有5行,算法會變成類似於

  • 檢索表中的第一行。指定它爲1.
  • 檢查此rownum對謂詞,丟棄
  • 檢索表中的第二行。分配它爲1.
  • 檢查這個rownum對謂詞,丟棄
  • 檢索表中的第三行。指定它爲1.
  • 檢查此rownum對謂詞,丟棄
  • 檢索表中的第四行。指定它爲1.
  • 檢查這個rownum對謂詞,丟棄
  • 檢索表中的第五行。它分配1.
  • 檢查對ROWNUM謂詞這ROWNUM,丟棄

由於沒有「第一行」在結果集中,就不可能有「第二排」。您可以在不等式比較中使用ROWNUM,即

SELECT * 
    FROM table_name 
WHERE rownum <= 2 

將返回2行。

如果你想在表格來確定,「第二行」,你很可能要像

SELECT * 
    FROM (SELECT t.*, 
       rank() over (order by some_column) rnk 
      FROM table_name) 
WHERE rnk = 2 
+0

得到的答案這是一個可惜的Oracle不提出這個錯誤,已經看到它很多。 –