我不是职业搞数据库的,我做的事web,因为分页,自己写的sql出错,百度别人的
会用但看不懂,所以特来求教!
这是我写的sql:select * from 
       (select * from user_info where rownum < = 8)
       where rownum>=5
结果,这一段根本不执行!我百度了,发现这样一段代码,和我的类似:SELECT * FROM ( SELECT A.*, ROWNUM RN 
FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21
我看不懂这条写的,为什么他的就执行了 ?问题:
1、我的错在哪里?
2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?
3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?----------------
菜鸟,忘提示!!!望指教!!!

解决方案 »

  1.   

    rownum是oracle自动生成的行号,只能小于,不能大于。因为他永远从1开始,有了1才有2,有了2才有3.。
      

  2.   


    谢谢,那我的第一个问题就被解决了 !
    现在还有问题,那就是后面我贴出了别人写的sql代码,
    在第二个sql代码(别人写的)中,就出现了WHERE RN >= 21 啊!
    ---------
    另外,可否连我的问题2、3一并解决呢 ?
      

  3.   

    首先知道rownum永远都是死的 只能针对当个查询 如果加个别名就不同了你的sql里面  外层rownum只是针对了外面一层的行号 所以不可能 >= 21 必然会报错他的sql 在内层的时候已经赋值一个别名rn 等于在外面访问rn 是内层的行号 
      

  4.   

    2、他的代码里,SELECT A.*, ROWNUM RN 指的是什么 ?--先把序号查出来作为一列, 这样外层查询 就能使用 这个序号判断了,那就是真正的 行
    3、为什么我百度的代码里, WHERE RN >= 21改成WHERE ROWNUM >=21报错?
    --应该不会报错吧?最多是查不出数据罢了。
      

  5.   

    直接让rownum >= 查不出值,rownum都是从1开始的,你让他 >21 ,它找不到21就一直又从1开始了,导致查不到值。像 HJ_daxian 说的,在里面把它别名定义出来,这样在外面就可以让他 > 了,就可以用了。
      

  6.   

    rn  是起的别名,然后就可以>=了。就是这么神奇的东西,呵呵
      

  7.   


    我原本认为的是:A只是user_info这张表查出的所有数据的一个别名,然后A与rn构成新的一张表显示出来,于是,我决定去掉别名A,我改成SELECT * FROM ( SELECT *, ROWNUM RN 
    FROM (SELECT * FROM user_info )  WHERE ROWNUM <= 8 order by id ) WHERE RN >= 3
    可此时程序就报错了!
    错误提示:ORA-00923,未找到要求的from关键字。请问这是为什么 ? 能够解释 ?
      

  8.   


    那么别名何时开始可以用 ?
    我把百度的代码改了下,
    select * from (
             select A.*, rownum rn from (select * from user_info) A where rn < 8
           )
           where rn > 3
    代码就错了!
    而如果把内层的where rn<8改成 rownum<8,sql就正确了!
    请问,1、这是为什么?2、别名何时可用?
      

  9.   


    我还有些疑惑,在 7 楼提出来了,能否指点下 !估计是oracle的语法所致吧,,在sqlserver数据库是可以你这么写的。
      

  10.   


    我原本认为的是:A只是user_info这张表查出的所有数据的一个别名,然后A与rn构成新的一张表显示出来,于是,我决定去掉别名A,我改成SELECT * FROM ( SELECT *, ROWNUM RN 
    FROM (SELECT * FROM user_info )  WHERE ROWNUM <= 8 order by id ) WHERE RN >= 3
    可此时程序就报错了!
    错误提示:ORA-00923,未找到要求的from关键字。请问这是为什么 ? 能够解释 ?
    你确定你的user_info这个表是存在的吗?
      

  11.   


    那么别名何时开始可以用 ?
    我把百度的代码改了下,
    select * from (
             select A.*, rownum rn from (select * from user_info) A where rn < 8
           )
           where rn > 3
    代码就错了!
    而如果把内层的where rn<8改成 rownum<8,sql就正确了!
    请问,1、这是为什么?2、别名何时可用?别名 在外层查询用啊。。
      

  12.   


    那么别名何时开始可以用 ?
    我把百度的代码改了下,
    select * from (
             select A.*, rownum rn from (select * from user_info) A where rn < 8
           )
           where rn > 3
    代码就错了!
    而如果把内层的where rn<8改成 rownum<8,sql就正确了!
    请问,1、这是为什么?2、别名何时可用?
    因为rn这时候还不起作用,别名在外层才起作用。就是说你起的别名在当前where字句中是不能用的,必须再套一层from语句
      

  13.   


    我原本认为的是:A只是user_info这张表查出的所有数据的一个别名,然后A与rn构成新的一张表显示出来,于是,我决定去掉别名A,我改成SELECT * FROM ( SELECT *, ROWNUM RN 
    FROM (SELECT * FROM user_info )  WHERE ROWNUM <= 8 order by id ) WHERE RN >= 3
    可此时程序就报错了!
    错误提示:ORA-00923,未找到要求的from关键字。请问这是为什么 ? 能够解释 ?
    你确定你的user_info这个表是存在的吗?
    是的,是这张表:user_info (代表user`s information)那请问为什么错了呢 ?【我用的是Oracle数据库】
      

  14.   


    我还有些疑惑,在 7 楼提出来了,能否指点下 !提2点 1:oracle查询中 单纯的*和其他字段不能一起使用 否则报错 找不到from 
        在上面SELECT *, ROWNUM RN FROM ... 语法有问题 2:SELECT *, ROWNUM RN FROM (SELECT * FROM user_info )
        后面这个子查询有必要么 直接select a.*,rownum rn from user_info a where ...就可以了
      

  15.   


    我原本认为的是:A只是user_info这张表查出的所有数据的一个别名,然后A与rn构成新的一张表显示出来,于是,我决定去掉别名A,我改成SELECT * FROM ( SELECT *, ROWNUM RN 
    FROM (SELECT * FROM user_info )  WHERE ROWNUM <= 8 order by id ) WHERE RN >= 3
    可此时程序就报错了!
    错误提示:ORA-00923,未找到要求的from关键字。请问这是为什么 ? 能够解释 ?可以解释的,这里SELECT *, ROWNUM RN 
    FROM (SELECT * FROM user_info
    *,是不行的,不能这样查询,只能查询一个*或者rownum。
      

  16.   


    我原本认为的是:A只是user_info这张表查出的所有数据的一个别名,然后A与rn构成新的一张表显示出来,于是,我决定去掉别名A,我改成SELECT * FROM ( SELECT *, ROWNUM RN 
    FROM (SELECT * FROM user_info )  WHERE ROWNUM <= 8 order by id ) WHERE RN >= 3
    可此时程序就报错了!
    错误提示:ORA-00923,未找到要求的from关键字。请问这是为什么 ? 能够解释 ?可以解释的,这里SELECT *, ROWNUM RN 
    FROM (SELECT * FROM user_info
    *,是不行的,不能这样查询,只能查询一个*或者rownum。
    如果要一起查询的话起个别名,这个结果集就会当做一个表来查询,就可以用查询表的方式查询他的所有字段啦
      

  17.   


    那么别名何时开始可以用 ?
    我把百度的代码改了下,
    select * from (
             select A.*, rownum rn from (select * from user_info) A where rn < 8
           )
           where rn > 3
    代码就错了!
    而如果把内层的where rn<8改成 rownum<8,sql就正确了!
    请问,1、这是为什么?2、别名何时可用? select 语句执行时,先加载from ,其次加载 where ,然后加载select部分, select A.*, rownum rn from (select * from user_info) A where rn < 8; 这个语句,执行完from部分后会执行where部分,这时候 rownum还未定义为 rn 所以就出错了 
      

  18.   


    我在9楼提出了个别名的问题:
    我依然不知道Oracle中别名什么时候用。
    请看场景1:
        首先请看一个正确的:select * from user_info a where a.id = 2
    这里我定义完别名 a 后直接使用a ,a.id =2 就可以了。请看场景2:
        然而在9楼提出的,
    select * from (
          select A.*, rownum rn from (select * from user_info) A where rn < 8
        )
        where rn > 3
    我在这里也是,内层定义完rownum别名rn后直接使用rn却错了 !场景1和场景2都是使用别名,怎么1对了2错了呢 ?
      

  19.   


    那么别名何时开始可以用 ?
    我把百度的代码改了下,
    select * from (
             select A.*, rownum rn from (select * from user_info) A where rn < 8
           )
           where rn > 3
    代码就错了!
    而如果把内层的where rn<8改成 rownum<8,sql就正确了!
    请问,1、这是为什么?2、别名何时可用? select 语句执行时,先加载from ,其次加载 where ,然后加载select部分, select A.*, rownum rn from (select * from user_info) A where rn < 8; 这个语句,执行完from部分后会执行where部分,这时候 rownum还未定义为 rn 所以就出错了 高手,明白了 !
      

  20.   


    我在9楼提出了个别名的问题:
    我依然不知道Oracle中别名什么时候用。
    请看场景1:
        首先请看一个正确的:select * from user_info a where a.id = 2
    这里我定义完别名 a 后直接使用a ,a.id =2 就可以了。请看场景2:
        然而在9楼提出的,
    select * from (
          select A.*, rownum rn from (select * from user_info) A where rn < 8
        )
        where rn > 3
    我在这里也是,内层定义完rownum别名rn后直接使用rn却错了 !场景1和场景2都是使用别名,怎么1对了2错了呢 ?
    这2个 很明显的不同 表别名和字段别名表别名 只能在当个查询里面用到字段别名 是为了在外层查询用的 在当个查询里面使用 肯定会报错 找不到改字段
      

  21.   


    我在9楼提出了个别名的问题:
    我依然不知道Oracle中别名什么时候用。
    请看场景1:
        首先请看一个正确的:select * from user_info a where a.id = 2
    这里我定义完别名 a 后直接使用a ,a.id =2 就可以了。请看场景2:
        然而在9楼提出的,
    select * from (
          select A.*, rownum rn from (select * from user_info) A where rn < 8
        )
        where rn > 3
    我在这里也是,内层定义完rownum别名rn后直接使用rn却错了 !场景1和场景2都是使用别名,怎么1对了2错了呢 ?
    这2个 很明显的不同 表别名和字段别名表别名 只能在当个查询里面用到字段别名 是为了在外层查询用的 在当个查询里面使用 肯定会报错 找不到改字段听这么一说,倒有点糊涂 !
    那么18楼说的对不 ?
      

  22.   


    是对的 一般sql执行顺序
        (1) FROM 子句 组装来自不同数据源的数据
      (2) WHERE 子句 基于指定的条件对记录进行筛选
      (3) GROUP BY 子句 将数据划分为多个分组
      (4) 使用聚合函数进行计算
      (5) 使用HAVING子句筛选分组
      (6) 计算所有的表达式
      (7) 使用ORDER BY对结果集进行排序 用sql语法表示的话 大致这样
      1. FROM
      2. WHERE
      3. GROUP BY
        4. SUM、AVG..
      5. HAVING
      6. SELECT
      7. DISTINCT
      8. ORDER BY
      9. TOP
      

  23.   


    是对的 一般sql执行顺序
        (1) FROM 子句 组装来自不同数据源的数据
      (2) WHERE 子句 基于指定的条件对记录进行筛选
      (3) GROUP BY 子句 将数据划分为多个分组
      (4) 使用聚合函数进行计算
      (5) 使用HAVING子句筛选分组
      (6) 计算所有的表达式
      (7) 使用ORDER BY对结果集进行排序 用sql语法表示的话 大致这样
      1. FROM
      2. WHERE
      3. GROUP BY
        4. SUM、AVG..
      5. HAVING
      6. SELECT
      7. DISTINCT
      8. ORDER BY
      9. TOP  
    学习了 HJ_daxian 是我见过的 同Dave,向上一个级别的oracle大牛