簡體   English   中英

在oracle中使用rownum獲取數據

[英]fetching data using rownum in oracle

我在oracle中有一個查詢,要使用rownum從表中獲取數據,但沒有得到任何數據。
我的查詢是這樣的:

select * from table-name where rownum<5

這是獲取行號小於5的數據的錯誤查詢嗎?
當我使用像這樣的查詢時:
select * from table-name where rownum<=4
比它會給出結果記錄。

我的問題是這里出什么問題了?
這是語法錯誤還是其他??

rownum是偽列,該偽列在應用where子句之后對結果集中的行進行計數。

  SELECT table_name
    FROM user_tables
    WHERE rownum > 2;
TABLE_NAME                     
------------------------------

0 rows selected

但是,此查詢將始終返回零行,而不管表中的行數如何。

為了解釋這種行為,我們需要了解Oracle如何處理ROWNUM。 將ROWNUM分配給行時,Oracle從1開始,並且僅在選擇行時才遞增該值; 也就是說,當滿足WHERE子句中的所有條件時。 由於我們的條件要求ROWNUM大於2,所以不會選擇任何行,並且ROWNUM永遠不會超過1。

http://blog.lishman.com/2008/03/rownum.html

另一個stackoverflow鏈接

已編輯

我在oracle網站上找到了這個段落

ROWNUM值大於正整數的條件測試始終為false。 例如,此查詢不返回任何行:

SELECT * FROM employees
    WHERE ROWNUM > 1;

提取的第一行的ROWNUM分配為1,並使條件為false。 現在要獲取的第二行是第一行,並且還分配了ROWNUM為1並使條件為false。 隨后所有行均不滿足該條件,因此不返回任何行。

您還可以使用ROWNUM為表的每一行分配唯一值,如本示例所示:

語法對我來說似乎是正確的。

但是,ROWNUM是根據結果行計算的,例如:

SELECT * FROM TABLE_NAME WHERE ROWNUM < 10 ORDER BY TABLE_FIELD ASC;

SELECT * FROM TABLE_NAME WHERE ROWNUM < 10 ORDER BY TABLE_FIELD DESC;

會給你不同的結果。

每次執行查詢時,Oracle會為每個元組分配一個ROWNUM,該行的作用域是該唯一查詢。

你想達到什么目的 ?

由於出於rahularyansharma提及的原因,基於行數的查詢並不總是能按您期望的方式運行,因此解決此問題的方法是執行類似

SELECT * from (SELECT rownum AS rn, TABLE_NAME.* FROM TABLE_NAME)
where rn > 5;

但是,請注意,在對大型數據集進行操作時,這將是一個非常低效的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM