wyyy721 发表于 2018-9-26 11:49:14

Oracle查询rownum与rowid的不同之处

  以下的文章主要是介绍Oracle查询rownum与rowid的不同之处,以及以假设的方式即,查询条件为rownum = 2,在查询出第一条记录的时的具体内容的介绍,以下就是文章的详细内容的介绍。

    在查询中,我们可以注意到,类似于
  


[*]select xx from table where rownum < n (n>1)
  

  这样的查询是有正确含义的,而
  


[*]select xx from table where rownum = n
  

  这样的查询只在n=1的时候成立,
  


[*]select xx from table where rownum > n (n>1)
  

  这样的查询只能得到一个空集。
  另外
  


[*]select xx from table where rownum > 0
  

  这个查询会返回所有的记录。这是为什么呢?原因就在于Oracle对rownum的处理上,rownum是在得到结果集的时候产生的,用于标记结果集中结果顺序的一个字段,这个字段被称为“伪数列”,也就是事实上不存在的一个数列。
  它的特点是按顺序标记,而且是逐次递加的,换句话说就是只有有rownum=1的记录,才可能有rownum=2的记录。
  让我们回头来分析一下在where中使用rownum作为Oracle查询条件的情况。在rownum取=1,或者rownum 1)的时候,没有问题。那么为什么当条件为rownum = n或者rownum >= n时明明有数据却只能得到一个空集呢?假设我们的查询条件为rownum = 2,那么在查询出的第一条记录的时候,Oracle标记此条记录rownum为1,结果发现和rownum=2的条件不符,于是结果集为空。
  写到这里,我忽然有一个有趣的想法:假如有一条查询语句为select xx,yy from table where zz > 20 and rownum < 10,那么在执行的时候,是先按照zz>20的条件查询出一个结果集,然后按照rownum取出前10条返回?还是在按照zz>20的条件先查询,然后有一个记录就标记一个rownum,到rownum20)where xyz between 10 and 20
  

  这样就可以了。
  另外使用Oracle提供的结果集处理函数minus也可以做到,例如
  


[*]select xx,yy from table where zz > 20 and rownum20 and rownum
页: [1]
查看完整版本: Oracle查询rownum与rowid的不同之处