![](/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.