oracle中使用rownum获取数据

Posted

技术标签:

【中文标题】oracle中使用rownum获取数据【英文标题】:fetching data using rownum in oracle 【发布时间】:2011-10-13 12:14:00 【问题描述】:

我在 oracle 中有一个查询要使用 rownum 从表中获取数据,但我没有得到任何数据。 我的查询是这样的:

select * from table-name where rownum<5

这是获取行号小于 5 的数据的错误查询吗。 当我使用查询时:select * from table-name where rownum<=4 比它会给出一个结果记录。

我的问题是这里有什么问题? 这是语法错误还是其他什么??..

【问题讨论】:

在此处使用 Oracle 10g 可以正常工作,但请注意,您无法控制返回哪 4 行...... 警告:ROWNUM 不是表的伪列,它是结果集的伪序列。 使用 order by 保证一致性 【参考方案1】:

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

another *** link

已编辑

我在oracle 网站上找到的这一段要好得多

对大于正整数的 ROWNUM 值进行条件测试始终为假。例如,此查询不返回任何行:

SELECT * FROM employees
    WHERE ROWNUM > 1;

提取的第一行被指定为 1 的 ROWNUM 并使条件为假。要获取的第二行现在是第一行,并且还分配了 1 的 ROWNUM 并使条件为假。随后所有行都不满足条件,因此不返回任何行。

您还可以使用 ROWNUM 为表的每一行分配唯一值,如下例所示:

【讨论】:

虽然正确,但这似乎并不能回答问题,即关于 ROWNUM 5。【参考方案2】:

语法对我来说似乎是正确的。

但是 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,该 ROWNUM 的范围仅限于该查询。

你想完成什么?

【讨论】:

感谢您的回答...但我试图在 oracle 中找到这种行为背后的原因..【参考方案3】:

由于 rahularyansharma 提到的原因,基于 rownum 的查询不会总是按您预期的方式运行,解决此问题的方法是执行类似

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

但是,请注意,在对大型数据集进行操作时,这将是一个相当低效的操作。

【讨论】:

以上是关于oracle中使用rownum获取数据的主要内容,如果未能解决你的问题,请参考以下文章

oracle 分页 使用rownum的分页方式

oracle 查询数据只要排序后的第一条记录(不用rownum=1),sql语句怎么写

oracle 查询数据只要排序后的第一条记录(不用rownum=1),sql语句怎么写

oracle 倒序查最后几条数据或去重后时间段获取

Oracle中的rownum 和rowid的用法和区别

Oracle - 实现MySQL的limit功能