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]