ROWNUM如何获取前N条记录,以及ROWNUM的都有哪些坑???

 

场景:获取待处理表按时间排序后前N条待处理记录

错误写法:select * from table_name where status = '0' and rownum <= 100 order by upd_time; --满足条件的记录取前100条后结束扫描,在排序这个结果集,功能未能实现;

正确写法:select * from (select * from table_name where status = '0' order by upd_time) where rownum <= 100; --获取满足条件的结果集,在排序,在取前100条记录

ROWNUM使用的几个注意点:

对于ORACLE的rownum问题,

假设表 t1(c1) 中有20条记录,

select rownum, c1 from t1 where rownum > 10;(如果你写下这个SQL,在你的头脑中因该是想得到表中后10条记录),运行SQL后显示出的结果会令你失望,也许您可能会怀疑有人删掉了后面的10条记录,然后查看记录数仍为 20 条?那问题出在哪里啊???

先好好理解rownum的意义吧,rownum是结果集的一个伪列,既先查到一个结果集之后,再加上的一个列 rownum(伪列),(强调:先结果集),简单的说,就是对符合条件结果集的序号,它总是从1开始排起的,所以你选出的结果集不可能没有1。

rownum > 10没记录,因为第一条记录不满的rownum = 1,不满足条件,第二条及记录的rownum又变成了1,所以永远没有满足条件的记录;

所以您没办法得到期望的下面的结果集

11 aaaaaa

12 bbbbbb

13 cccccc

................

了解了以上从不同方面建立的 rownum 概念之后,那我们来认识使用 rownum 的另外集中现象

1.select rownum, c1 from t1 where row_num != 10 为何返回的只有前 9 条记录啊?,它与select rownum, c1 from t1 where rownum < 10 返回的结果集是相同的, 原因如下:rownum 为 9 后的记录的 rownum 为10,因为条件 != 10,所以去掉rownum = 10 的记录,想在rownum 仍为 10,也去掉,继续下去继续这样下去也就只剩下*前面 9 条记*录了;

2.为什么 rownum > 1 时查询不到记录,rownum > 0 或 rownum >= 1 时,确总显示全部记录?

因为rownum总是从1开始的(先结果集);

3.为什么 between 1 and 10 或者 between 0 and 10 能查到结果集,而between 2 and 10却得不到结果集的原因和上面一样,因为rownum都是从1开始的。

但是如果要查 rownum > 10 的记录,可以使用嵌套语句,rownum先生成,然后在对它进行查询

select *

from (select rownum as num, t1.* from t1 where .....)

where num > 10;

另外:rowidrownum 虽都被称为伪列,但他们的存在方式是不同的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置 ID,在DB中唯一,只要记录没有被搬动过,rowid 是不变的,rowid 相对于表来说又象表中的一般列,所以一 rowid为条件的不会 发生 rownum 那些情况,

另外,还得注意,rownum 不能以任何基表的名称作为前缀

猜你喜欢

转载自blog.csdn.net/li_tiantian/article/details/85624890