繁体   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