今天在工作中遇到了个这样的问题:就是需要在查询的所有结果中只显示前六个数据,而且每个数据都要显示,所以我就用了rownum来控制每个数据。但是遇到了如下sql的问题:假设有张表名叫booking则
SELECT B.*
FROM BOOKING 
WHERE 1=1
      AND ROWNUM=1
--------------------这样就输出了数据集的第一行------------------
SELECT B.*
FROM BOOKING 
WHERE 1=1
      AND ROWNUM=2
按道理来说也应该数据第二行的数据,但是问题来了,没有显示出第二行的数据来。全都是空值~~没办法我就只好试了试接下来的这段SQL:
SELECT *
FROM (SELECT ROWNUM AS ROWN,
             B.*
      FROM BOOKING
      )
WHERE BOOKING.ROWN=2
这样不管你显示的是第几行都可!
我想请教各位朋友,这两个代码的区别在哪里?第一个为什么不会显示?

解决方案 »

  1.   


    rownum 是在查询到的结果集后加上去的,是一个总是从1开始的伪列,rownum=1 成立,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。
    ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716 
      

  2.   

    rownum一般用于<自然数,取排序后的第几条数,可以按照你写的第二种方法,我通常也那么写,另外,你可以使用函数row_number()over() 也是可以的
      

  3.   

    正想楼上几位解释的一样,rownum 的机制是:
    1、永远从 1 开始
    2、当满足条件之后 rownum 才 +1这就是说:
     1、如果 where rownum < 10 的话,rownum 先从 1 开始,1<10 因此 rownum + 1 直到10
     2、如果 where rowunm = 2  的话,rowunm 先从 1 开始,1≠2 因此 rownum 不会 + 1,一直是1
        而   1永远≠2,所以什么也就出不来了。
    解释清楚上面的时候,下面这个也就不难理解了:SELECT * 
    FROM (SELECT ROWNUM AS ROWN, 
                B.* 
          FROM BOOKING 
          ) 
    WHERE BOOKING.ROWN=2 上面的代码中,内层的rownum相当于给每条记录实实在在加了一个行号,再在外层使用的时候,这个行号就实际存在了,就不会出现上面解释中的问题了,不过给你个建议最好还是在内层查询中给rownum起个别名,这样更安全些
    SELECT * 
    FROM (SELECT ROWNUM AS ROWN id, 
                B.* 
          FROM BOOKING 
          ) 
    WHERE BOOKING.id=2 
      

  4.   

    小白了
    没仔细看
    依然已经加了别名了。
    SELECT * 
    FROM (SELECT ROWNUM AS ROWN, 
                B.* 
          FROM BOOKING 
          ) 
    WHERE BOOKING.ROWN=2 
      

  5.   

    SELECT B.* 
    FROM BOOKING 
    WHERE  rownum <=5 and rownum<=10这样也可以吧?