Oracle02-rownum伪列与分页

来源:互联网 发布:三星s7edge主题软件 编辑:程序博客网 时间:2024/06/05 09:04
伪列:rownum摘自百度百科:

数据库术语,指的是在物理上这个列并不存在,只是在查询时才构造出来。伪列通常是自由分配的,用户无法执行修改等操作。比如Oracle中的RowID字段,使用RowID可以快速地定位到某个对应的数据,因为它标记了记录所对应的物理地址,是唯一的。RowNum,Level也是Oracle中常见的伪列。

参考总结:

伪列,rownum其实是对结果集加了一个伪序列,先查到结果集之后,再加上一个物理上并不存在的列,是每一次符合条件结果集的重新编号。总是从1开始,所以你通过(>,>=,between...and..)rownum得到的,不能没有1,而是从其他的值开始的。

例如:select 之后得到一个结果集,rownum,对这个结果集,从1开始编号。

你要求 : select rownum,id from(select *from test order by id) where rownum >= 1 and rownum<=4;是可以的,从一开始。

但是如果: select rownum,id from(select *from test order by id) where rownum >= 2 and rownum<=4;就会出错,当order  id 之后,结果集第一个,伪列rownum=1,不满足条件,去掉;第二个,rownum还会是1(不会变成2),所以最后没有一行选中。

解决办法:

依旧子查询,通过rownum伪列命名一个别名,通过别名限定。

select rn,id from (select rownum as rn ,id from (select * from test order by id)) where rn>=2 and rn<=4;

两个子查询:第一个,排序,得到正确的顺序,并通过伪列编号。

   第二个,定义别名,将伪列编号,限定数据。

常用的两个分页方法:

1、高效。

SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
2、

SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40

0 0
原创粉丝点击