SQL语句如下:
SELECT rownum ,orderhist.orderid ,orderhist.senddt,contact.name, from orderhist inner join contact 
on orderhist.contactid=contact.contactid where 1=1 and rownum between  1 and 40orderhist 为订单表   contact为联系人表  
执行上面的语句  可以得到  rownum为 1-40的信息  
格式如下:
rownum  orderid     senddt         name1       65445       2009-08-27     张三 
。。
但是为什么改成   只要把 between 后面的1 改成其他任意数字 就查不出来了  
SELECT rownum ,orderhist.orderid ,orderhist.senddt,contact.name, from orderhist inner join contact 
on orderhist.contactid=contact.contactid where 1=1 and rownum between  2 and 40  查不到数据 怎么回事 ?

解决方案 »

  1.   

    参考文档:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns009.htm#SQLRF00255
    Conditions testing for ROWNUM values greater than a positive integer are always false. For example, this query returns no rows:SELECT * FROM employees
        WHERE ROWNUM > 1;
      

  2.   

    rownum没有1就没有后面,你如果要分页select * from (
    SELECT rownum rn,orderhist.orderid ,orderhist.senddt,contact.name, from orderhist inner join contact
    on orderhist.contactid=contact.contactid where 1=1 and rownum<= 40
    ) where rn > 2
      

  3.   

    rownum的用法楼主需要熟悉一下
    rownum是对查询结果添加的一个伪列。没有1就不存在2,也不存在3.4.5.。。
    rownum和order放在同一级查询语句里无效,因为order是将查询结果在内存里进行排序,排序前rownum已生成
    用rownum>1不会产生结果
    要实现分页功能,可采取取列别名的方法,如楼上的代码
      

  4.   

    rownum 不能用between 2 and 10之类的,如果要分页的话看下面的例子。
    SELECT *
    FROM (SELECT a.*,rownum  rn FROM t1 a)
    WHERE rn BETWEEN 21 AND 40;
      

  5.   

    可以这样来看rownum的机制rownum是一个顺序号,是oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。如果你用>,>=,=,between...and这些条件,因为从缓冲区或数据文件中得到的第一条记录的rownum为1,则被删除,接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据
      

  6.   

    rownum没有1就没有后面
    rownum 找不到第一个,就停止了 
    rownum 是Key stop
      

  7.   

    http://www.cnblogs.com/chinhr/archive/2007/09/30/911685.html的确如此    多谢各位解答    已搞定  
      

  8.   

    总结一下Rownum的用法 
    SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact 
    on orderhist.contactid=contact.contactid where 1=1 and rownum between 1 and 300
    这样写没问题  SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact 
    on orderhist.contactid=contact.contactid where 1=1 and rownum between 2 and 300
    查不出数据  因为Rownum是从1开始,如果第一项不匹配,后面的就都不匹配  这就是为什么写成  between 0 and  .....    或者 between 1 and .....
    rownum>0   rownum>=1  都可以查询到数据 而  between 2 and .....       rownum>1 却查不到数据 嵌套查询可以解决该问题 select * from (
    SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact 
    on orderhist.contactid=contact.contactid where 1=1 and rownum<=400) where rnm >= 30或者 
    select * from (
    SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact 
    on orderhist.contactid=contact.contactid where 1=1) where rnm >= 30 and rnm<=400或者
    select * from (
    SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact 
    on orderhist.contactid=contact.contactid where 1=1) where rnm between 30 and 400
      

  9.   

    嵌套的为什么就可以查出来 而非嵌套的却查不出来  
    SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact 
    on orderhist.contactid=contact.contactid where 1=1 and rownum between 1 and 300 因为ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果必须有1
    上面的SQL语句 是先得到返回结果集  然后才有RowNum
    select * from ( 
    SELECT rownum rnm ,orderhist.orderid ,orderhist.senddt,contact.name from orderhist inner join contact 
    on orderhist.contactid=contact.contactid where 1=1 and rownum <=400) where rnm >= 30 括号里面的子查询 也是得到结果集 然后才有了Rownum,但是对于外面的查询而言 Rownum已提前生成 所以才可以这么写   有一个先后顺序  不知道我的理解对否,各位继续补充
      

  10.   

    oracle和SQL差距还是蛮大的,平时用SQLSERVER可能会比较多,偶尔用Oracle觉得很生疏 
      

  11.   

    总结的不错
    rownum和rowid都是一个伪列.
      

  12.   


    rowid 与 rownum 虽都被称为伪列,但它们的存在方式是不一样的,rowid 可以说是物理存在的,表示记录在表空间中的唯一位置ID,在DB中唯一。只要记录没被搬动过,rowid是不变的。rowid 相对于表来说又像表中的一般列,所以以 rowid 为条件就不会有 rownum那些情况发生,rownum不能以任何基表的名称作为前缀,而rownum则是“货真价实”的伪列   。