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=1),sql语句怎么写