![](/img/trans.png)
[英]Fetching data for rownum = 1 but not for other than 1 in Oracle SQL
[英]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
已編輯
我在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.