一般我们分页查询都这么写: 嵌套的SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40
)
WHERE RN >= 21
这样写为什么不可以呢?SELECT * FROM A where rownum >=21 and rownum <=40

解决方案 »

  1.   

    因为rownum 是Oracle的一个伪列,就像游标一样,只是往下走,不能回头,所以在你没有拿到数据的时候,rownum是为0的,
      

  2.   

    作为结果集的第一条数据其rownum=0,后面rownum会增长
    在where条件中“rownum>N”的条件是没有意义的
      

  3.   

    SELECT * FROM A where rownum >=21 and rownum <=40rownum不是数据的列,是表的一个伪列。
    他的记录是当你解析where之后,当你要显示列的时候才为每列显示的一个序号,
    现在你在where条件里做出判断,因为此时你选择的列还没有安排位序,所以你查不到任何记录
      

  4.   

    rownum 是查出数据后在给加列的。
    SELECT rownum num,b.* FROM A b where b.num>=21 and b.num<=40
    这样是可以的
      

  5.   

    ----------才给别人回答一次复制一次了太长了,
    rownum是一个序号
    根据你sql查询出来的结果 第一笔数据的序号就是1
    依次往下
    rownum只能小于 一个数字。。
    不能大于一个数字。。
    select *from table rownum between 11 and 15
    这个 sql查询出来的结果 是 从11到 15 的数据。。
    这个时候 序列1的数据是不显示出来的
    但是这个结果集一旦出来呢 第11笔数据又变成了 第1笔 。。
    序号11的数据成了 序号1的数据。。但是呢。。
    原本 又有个 序号为1的数据。。此时会出现两个序号1数据 冲突 。。rownum是唯一的 。。不能重复的
    所以 在 查询出来的结果集 外面 嵌套一层  
    select t.* from (select *,rownum as num from table ) t where t.num between 11 and 15
    是可以的因为此时 子句查询出来的结果 按照 当前的顺序 以及包含序号的结果 成为了一个结果集
    那么这里的 rownum 成为了 别名为t 这个表(结果集)的一个字段。。
    故而不存在冲突了
    不知道 LZ是否明白了
      

  6.   

    rownum 默认1开始的,一个伪列 只有少于--你试试这个你就明白 后面的rownum <=40 是成立的SELECT * FROM A where rownum >=21 or rownum <=40