SELECT *
  FROM (SELECT A.*, ROWNUM RN
          FROM (SELECT * FROM TABLE_NAME) A
         WHERE ROWNUM <= 40)
 WHERE RN >= 21;
SELECT *
  FROM (SELECT A.*, ROWNUM 
          FROM (SELECT * FROM t_meta_goods) A
         WHERE ROWNUM <= 40)
 WHERE ROWNUM >= 21;麻烦看下这2个sql,为什么第一种可以查出数据,第二种就查不到数据呢?

解决方案 »

  1.   

    rownum是对结果集的编序排列,始终是从1开始,所以你的rownum>2永远为假,所以就没记录返回rownum只能用于<,如果要用>要么用rownumber()OVER,要么就实例化用ROW_NUMBER() OVER()解决 SELECT empno, ename, job, mgr, hiredateFROM (SELECT empno, ename, job, mgr, hiredate, ROW_NUMBER() OVER(ORDER BY empno) rkFROM emp) tWHERE rk > 2 或者实例化就可以了SELECT empno, ename, job, mgr, hiredateFROM (SELECT empno, ename, job, mgr, hiredate, rownum rkFROM emp) tWHERE rk > 2
      

  2.   

    rownum只能小于等于,不能大于
      

  3.   


    这个我知道呀
    但是
    WHERE RN >= 21;中的RN不就是ROWNUM 的笔名吗?SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A
      

  4.   


    这个我知道呀
    但是
    WHERE RN >= 21;中的RN不就是ROWNUM 的笔名吗?SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A
    你说的对啊,你也说了,第一个能查出数据,第二个查不出来。第一个能查出数据,因为内查询的rownum已经变成RN了,但是第二个查不出来,因为你外查询又使用到了rownum,他表示外查询的rownum呀
      

  5.   

    首先要知道 非别名的rownum只是真对当前sql 不包括子查询或者外套的查询第一个sql 嵌套的sql可以根据内层别名rn来过滤 这个没问题 第二个sql 里面一层rownum可以查询里面的前40行 但是在外面的一层rownum只是真对外面的 当然不可能查询大于20了
     
      

  6.   

    SELECT *
      FROM (SELECT A.*, ROWNUM  ru  -------加别名
              FROM (SELECT * FROM t_meta_goods) A
             WHERE ROWNUM <= 40)
     WHERE ru>= 21;这样可以的
      

  7.   

    ROWNUM每次取值都是从1开始,所以你用>符号是什么也查不到的,上面能查到那个是因为你对ROWNUM用了别名。
      

  8.   

    因为ROENUM是动态的,先查到结果集,然后再添加从1开始的序列,当一个条件过滤掉一些符合的记录之后,后面查询的结果集又从1开始编号,所以第2条语句查询不出来。所以一般嵌套查询需要ROWNUM时用别名比较好。