ORACLE ROWNUM解析
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp53
[align=middle;" align="left] [size=11.5pt; font-family: 宋体; color: #333333;]标题:[/size][size=11.5pt; font-family: 宋体; color: #333333;]Oracle[/size][size=11.5pt; font-family: 宋体; color: #333333;]中的[/size][size=11.5pt; font-family: 宋体; color: #333333;]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]不能使用大于[/size][size=11.5pt; font-family: 宋体; color: #333333;]>[/size][size=11.5pt; font-family: 宋体; color: #333333;]的问题[/size]
[size=11.5pt; font-family: 宋体; color: #333333;]一、对[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]的说明[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]并非说用[/size][size=11.5pt;" lang="EN-US]“>[/size][size=11.5pt; font-family: 宋体; color: #333333;]、[/size][size=11.5pt;" lang="EN-US]>=[/size][size=11.5pt; font-family: 宋体; color: #333333;]、[/size][size=11.5pt;" lang="EN-US]=[/size][size=11.5pt; font-family: 宋体; color: #333333;]、[/size][size=11.5pt;" lang="EN-US]between..and”[/size][size=11.5pt; font-family: 宋体; color: #333333;]时会提示[/size][size=11.5pt;" lang="EN-US]SQL[/size][size=11.5pt; font-family: 宋体; color: #333333;]语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来。[/size]
[size=11.5pt;" lang="EN-US] rowid[/size] [size=11.5pt; font-family: 宋体; color: #333333;]与[/size] [size=11.5pt;" lang="EN-US]rownum[/size] [size=11.5pt; font-family: 宋体; color: #333333;]虽都被称为伪列,但它们的存在方式是不一样的:[/size]
[size=11.5pt;" lang="EN-US] rowid[/size] [size=11.5pt; font-family: 宋体; color: #333333;]相对于表来说又像表中的一般列,所以,以[/size] [size=11.5pt;" lang="EN-US]rowid[/size] [size=11.5pt; font-family: 宋体; color: #333333;]为条件就不会有[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]那些莫名其妙的结果出现。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]对于下面的[/size][size=11.5pt;" lang="EN-US]SQL[/size][size=11.5pt; font-family: 宋体; color: #333333;]语句[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]因为[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]总是从[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]开始的,第一条不满足去掉的话,第二条的[/size][size=11.5pt;" lang="EN-US]rownum[/size] [size=11.5pt; font-family: 宋体; color: #333333;]又成了[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]。依此类推,所以永远没有满足条件的记录。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]它取得第一条记录则[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]值为[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;],第二条为[/size][size=11.5pt;" lang="EN-US]2[/size][size=11.5pt; font-family: 宋体; color: #333333;]。依次类推。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]下条的[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]还会是[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;],又被删除,依次类推,便没有了数据。[/size]
[size=11.5pt;" lang="EN-US]
[/size][size=11.5pt; font-family: 宋体; color: #333333;]二、对[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]使用中几种现象的分析说明[/size][size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]有了以上从不同方面建立起来的对[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]的概念,下面认识使用[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]的几种现象[/size][size=11.5pt;" lang="EN-US]:[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;])[/size] [size=11.5pt;" lang="EN-US]select rownum,id,age,name from loaddata where rownum != 10[/size] [size=11.5pt; font-family: 宋体; color: #333333;]为何是返回前[/size][size=11.5pt;" lang="EN-US]9[/size][size=11.5pt; font-family: 宋体; color: #333333;]条数据呢?[/size][size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]为什么它与[/size] [size=11.5pt;" lang="EN-US]select rownum,id,age,name from loaddata where rownum [size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]也可以这样理解,[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]为[/size][size=11.5pt;" lang="EN-US]9[/size][size=11.5pt; font-family: 宋体; color: #333333;]后,取的记录的[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]为[/size][size=11.5pt;" lang="EN-US]10[/size][size=11.5pt; font-family: 宋体; color: #333333;],因条件为[/size] [size=11.5pt;" lang="EN-US]!=10[/size][size=11.5pt; font-family: 宋体; color: #333333;],所以删掉。然后取下一条,其[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]又是[/size][size=11.5pt;" lang="EN-US]10[/size][size=11.5pt; font-family: 宋体; color: #333333;],也删掉。以此类推。[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]2[/size][size=11.5pt; font-family: 宋体; color: #333333;])什么[/size][size=11.5pt;" lang="EN-US]rownum >1[/size][size=11.5pt; font-family: 宋体; color: #333333;]时查不到一条记录,而[/size] [size=11.5pt;" lang="EN-US]rownum >0[/size][size=11.5pt; font-family: 宋体; color: #333333;]或[/size][size=11.5pt;" lang="EN-US]rownum >=1[/size] [size=11.5pt; font-family: 宋体; color: #333333;]却总显示所有记录。[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]3[/size][size=11.5pt; font-family: 宋体; color: #333333;])为什么[/size][size=11.5pt;" lang="EN-US]between 1 and 10[/size] [size=11.5pt; font-family: 宋体; color: #333333;]或者[/size] [size=11.5pt;" lang="EN-US]between 0 and 10[/size] [size=11.5pt; font-family: 宋体; color: #333333;]能查到结果,而用[/size] [size=11.5pt;" lang="EN-US]between 2 and 10[/size] [size=11.5pt; font-family: 宋体; color: #333333;]却得不到结果。[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]从上可得[/size][size=11.5pt;" lang="EN-US],[/size][size=11.5pt; font-family: 宋体; color: #333333;]任何时候想把[/size][size=11.5pt;" lang="EN-US]rownum = 1[/size][size=11.5pt; font-family: 宋体; color: #333333;]这条记录抛弃是不对的。它在结果集中是不可或缺的。[/size]
[size=11.5pt;" lang="EN-US]
[/size][size=11.5pt; font-family: 宋体; color: #333333;]三、一些[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]实际运用的例子:[/size]
[size=11.5pt;" lang="EN-US] -----------
--sql[/size][size=11.5pt; font-family: 宋体; color: #333333;]建表脚本[/size]
[size=11.5pt;" lang="EN-US] create table LOADDATA
(
ID VARCHAR2(50),
AGE VARCHAR2(50),
NAME VARCHAR2(50)
);
-----------[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]如果希望找到[/size][size=11.5pt;" lang="EN-US]loaddata[/size][size=11.5pt; font-family: 宋体; color: #333333;]表中第一条记录的信息,可以使用[/size][size=11.5pt;" lang="EN-US]rownum=1[/size][size=11.5pt; font-family: 宋体; color: #333333;]作为条件。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]因为[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]都是从[/size][size=11.5pt;" lang="EN-US]“1”[/size][size=11.5pt; font-family: 宋体; color: #333333;]开始。[/size]
[size=11.5pt;" lang="EN-US]
select rownum,id,age,name
from loaddata
where rownum = 1; --[/size][size=11.5pt; font-family: 宋体; color: #333333;]可以用在限制返回记录条数的地方,保证不出错,如:隐式游标。[/size]
[size=11.5pt;" lang="EN-US]
SQL>select rownum,id,age,name from loaddata where rownum = 1;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA[/size]
[size=11.5pt;" lang="EN-US]
SQL>select rownum,id,age,name from loaddata where rownum = 2;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]注:[/size][size=11.5pt;" lang="EN-US]SQL>select rownum,id,age,name from loaddata where rownum != 3; --[/size][size=11.5pt; font-family: 宋体; color: #333333;]返回的是前[/size][size=11.5pt;" lang="EN-US]2[/size][size=11.5pt; font-family: 宋体; color: #333333;]条记录。[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200002 22 BBB[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]2[/size][size=11.5pt; font-family: 宋体; color: #333333;])[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]对于大于某值的查询条件[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]原因是由于[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]是一个总是从[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]开始的伪列,[/size][size=11.5pt;" lang="EN-US]Oracle[/size] [size=11.5pt; font-family: 宋体; color: #333333;]认为[/size][size=11.5pt;" lang="EN-US]rownum> n(n>1[/size][size=11.5pt; font-family: 宋体; color: #333333;]的自然数[/size][size=11.5pt;" lang="EN-US])[/size][size=11.5pt; font-family: 宋体; color: #333333;]这种条件依旧不成立,所以查不到记录。[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]那如何才能找到第二行以后的记录?[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]注意子查询中的[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]必须要有别名,否则仍然会查不到记录,这是因为[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]不是某个表的列。[/size]
[size=11.5pt;" lang="EN-US]
SQL>select rownum,id,age,name from(select rownum no ,id,age,name from loaddata) where no > 2;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
3 200003 22 CCC
4 200004 22 DDD
5 200005 22 EEE
6 200006 22 AAA[/size]
[size=11.5pt;" lang="EN-US]
SQL>select * from(select rownum,id,age,name from loaddata) where rownum > 2;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]3[/size][size=11.5pt; font-family: 宋体; color: #333333;])[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]对于小于某值的查询条件[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]显然[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]对于[/size][size=11.5pt;" lang="EN-US]rownum[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200002 22 BBB[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]综上几种情况:[/size]
[size=11.5pt;" lang="EN-US] rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]对于大于某值的查询条件直接认为是[/size][size=11.5pt;" lang="EN-US]false[/size][size=11.5pt; font-family: 宋体; color: #333333;]的,但是可以间接的让它转为认为是[/size][size=11.5pt;" lang="EN-US]true[/size][size=11.5pt; font-family: 宋体; color: #333333;]的,那就必须使用子查询。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]然后在主查询中判断新的[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]的[/size][size=11.5pt;" lang="EN-US]“[/size][size=11.5pt; font-family: 宋体; color: #333333;]别名列[/size][size=11.5pt;" lang="EN-US]”[/size][size=11.5pt; font-family: 宋体; color: #333333;]大于等于二的记录行。但是这样的操作会在大数据集中影响到检索速度。[/size]
[size=11.5pt;" lang="EN-US]
SQL>select * from (select rownum no,id,age,name from loaddata where rownum = 2; --[/size][size=11.5pt; font-family: 宋体; color: #333333;]必须是里小外大[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
2 200002 22 BBB
3 200003 22 CCC[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]也可以用这种方法实现[/size][size=11.5pt;" lang="EN-US]:[/size]
[size=11.5pt;" lang="EN-US] SQL>select rownum,id,age,name from loaddata where rownum [size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]4[/size][size=11.5pt; font-family: 宋体; color: #333333;])[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]和排序[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]前提条件:[/size][size=11.5pt;" lang="EN-US]loaddata[/size][size=11.5pt; font-family: 宋体; color: #333333;]表中已经[/size][size=11.5pt;" lang="EN-US]insert[/size][size=11.5pt; font-family: 宋体; color: #333333;]了[/size][size=11.5pt;" lang="EN-US]5[/size][size=11.5pt; font-family: 宋体; color: #333333;]条记录,最后一条记录[/size][size=11.5pt;" lang="EN-US]id[/size][size=11.5pt; font-family: 宋体; color: #333333;]是[/size][size=11.5pt;" lang="EN-US]200005[/size][size=11.5pt; font-family: 宋体; color: #333333;],接着[/size][size=11.5pt;" lang="EN-US]insert into loaddata values('200006','22','AAA');[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200002 22 BBB
3 200003 22 CCC
4 200004 22 DDD
5 200005 22 EEE
6 200006 22 AAA[/size]
[size=11.5pt;" lang="EN-US]
SQL>select rownum ,id,age,name from loaddata order by name;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
6 200006 22 AAA
2 200002 22 BBB
3 200003 22 CCC
4 200004 22 DDD
5 200005 22 EEE[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]系统是按照记录插入时的顺序给记录排的号,[/size][size=11.5pt;" lang="EN-US]rowid[/size][size=11.5pt; font-family: 宋体; color: #333333;]也是顺序分配的。[/size]
[size=11.5pt;" lang="EN-US] SQL>select rownum ,id,age,name from (select * from loaddata order by name);[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200006 22 AAA
3 200002 22 BBB
4 200003 22 CCC
5 200004 22 DDD
6 200005 22 EEE[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]这样就成了按[/size][size=11.5pt;" lang="EN-US]name[/size][size=11.5pt; font-family: 宋体; color: #333333;]排序,并且用[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]标出正确序号(有小到大)。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]同样,返回中间的记录集:[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
3 200002 22 BBB
4 200003 22 CCC[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]一般业务需求中,是需要先排序后,再返回中间记录集:[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
3 200002 22 BBB
4 200003 22 CCC[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]注意此时的[/size][size=11.5pt;" lang="EN-US]SQL[/size][size=11.5pt; font-family: 宋体; color: #333333;]语句写法,使用了多重(三层)嵌套。同时注意:[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]使用了[/size][size=11.5pt;" lang="EN-US]“[/size][size=11.5pt; font-family: 宋体; color: #333333;]列别名[/size][size=11.5pt;" lang="EN-US]”[/size][size=11.5pt; font-family: 宋体; color: #333333;]。[/size][size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]实际上,该语句也是[/size][size=11.5pt;" lang="EN-US]Oracle[/size][size=11.5pt; font-family: 宋体; color: #333333;]数据集一个经典的[/size][size=11.5pt;" lang="EN-US]SQL[/size][size=11.5pt; font-family: 宋体; color: #333333;]语句分页算法:先排序,再选择[/size][size=11.5pt;" lang="EN-US]rownum [/size] [size=11.5pt; font-family: 宋体; color: #333333;]某页的最小值。[/size]
[size=11.5pt; font-family: 宋体; color: #333333;]四、一个实例:[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]解:[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]是伪列,在表里没有,数据库先是执行[/size][size=11.5pt;" lang="EN-US]from book[/size][size=11.5pt; font-family: 宋体; color: #333333;]遍历[/size][size=11.5pt;" lang="EN-US]book[/size][size=11.5pt; font-family: 宋体; color: #333333;]表。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]如果有[/size] [size=11.5pt;" lang="EN-US]where[/size][size=11.5pt; font-family: 宋体; color: #333333;]条件,则不符合条件的就会从第一个结果集中删除,后面的数据继续加进来判断。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]可以用一个子查询来解决这个问题:对于[/size][size=11.5pt;" lang="EN-US]select rownum,id from book where rownum=2;[/size] [size=11.5pt; font-family: 宋体; color: #333333;]是查不出数据来的。[/size]
[size=11.5pt;" lang="EN-US]
declare
v_number binary_integer;
v_student student%rowtype;
begin
select count(*) into v_number from student;
for i in 1..v_number loop
select id,name,age into v_student from ( select rownum rn,id,name,age from student ) where rn=i;
dbms_output.put_line('id: '||v_student.id||' name:'||v_student.name);
end loop;
end;[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]简单的说[/size] [size=11.5pt;" lang="EN-US]rownum[/size] [size=11.5pt; font-family: 宋体; color: #333333;]是对符合条件结果的序列号。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]它总是从[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]开始排起的。所以,选出的结果不可能没有[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;],反而有其他大于[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]的值。[/size]
[/align]
[align=middle;" align="left] [size=11.5pt; font-family: 宋体; color: #333333;]标题:[/size][size=11.5pt; font-family: 宋体; color: #333333;]Oracle[/size][size=11.5pt; font-family: 宋体; color: #333333;]中的[/size][size=11.5pt; font-family: 宋体; color: #333333;]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]不能使用大于[/size][size=11.5pt; font-family: 宋体; color: #333333;]>[/size][size=11.5pt; font-family: 宋体; color: #333333;]的问题[/size]
[size=11.5pt; font-family: 宋体; color: #333333;]一、对[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]的说明[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]并非说用[/size][size=11.5pt;" lang="EN-US]“>[/size][size=11.5pt; font-family: 宋体; color: #333333;]、[/size][size=11.5pt;" lang="EN-US]>=[/size][size=11.5pt; font-family: 宋体; color: #333333;]、[/size][size=11.5pt;" lang="EN-US]=[/size][size=11.5pt; font-family: 宋体; color: #333333;]、[/size][size=11.5pt;" lang="EN-US]between..and”[/size][size=11.5pt; font-family: 宋体; color: #333333;]时会提示[/size][size=11.5pt;" lang="EN-US]SQL[/size][size=11.5pt; font-family: 宋体; color: #333333;]语法错误,而是经常是查不出一条记录来,还会出现似乎是莫名其妙的结果来。[/size]
[size=11.5pt;" lang="EN-US] rowid[/size] [size=11.5pt; font-family: 宋体; color: #333333;]与[/size] [size=11.5pt;" lang="EN-US]rownum[/size] [size=11.5pt; font-family: 宋体; color: #333333;]虽都被称为伪列,但它们的存在方式是不一样的:[/size]
[size=11.5pt;" lang="EN-US] rowid[/size] [size=11.5pt; font-family: 宋体; color: #333333;]相对于表来说又像表中的一般列,所以,以[/size] [size=11.5pt;" lang="EN-US]rowid[/size] [size=11.5pt; font-family: 宋体; color: #333333;]为条件就不会有[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]那些莫名其妙的结果出现。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]对于下面的[/size][size=11.5pt;" lang="EN-US]SQL[/size][size=11.5pt; font-family: 宋体; color: #333333;]语句[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]因为[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]总是从[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]开始的,第一条不满足去掉的话,第二条的[/size][size=11.5pt;" lang="EN-US]rownum[/size] [size=11.5pt; font-family: 宋体; color: #333333;]又成了[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]。依此类推,所以永远没有满足条件的记录。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]它取得第一条记录则[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]值为[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;],第二条为[/size][size=11.5pt;" lang="EN-US]2[/size][size=11.5pt; font-family: 宋体; color: #333333;]。依次类推。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]下条的[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]还会是[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;],又被删除,依次类推,便没有了数据。[/size]
[size=11.5pt;" lang="EN-US]
[/size][size=11.5pt; font-family: 宋体; color: #333333;]二、对[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]使用中几种现象的分析说明[/size][size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]有了以上从不同方面建立起来的对[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]的概念,下面认识使用[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]的几种现象[/size][size=11.5pt;" lang="EN-US]:[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;])[/size] [size=11.5pt;" lang="EN-US]select rownum,id,age,name from loaddata where rownum != 10[/size] [size=11.5pt; font-family: 宋体; color: #333333;]为何是返回前[/size][size=11.5pt;" lang="EN-US]9[/size][size=11.5pt; font-family: 宋体; color: #333333;]条数据呢?[/size][size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]为什么它与[/size] [size=11.5pt;" lang="EN-US]select rownum,id,age,name from loaddata where rownum [size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]也可以这样理解,[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]为[/size][size=11.5pt;" lang="EN-US]9[/size][size=11.5pt; font-family: 宋体; color: #333333;]后,取的记录的[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]为[/size][size=11.5pt;" lang="EN-US]10[/size][size=11.5pt; font-family: 宋体; color: #333333;],因条件为[/size] [size=11.5pt;" lang="EN-US]!=10[/size][size=11.5pt; font-family: 宋体; color: #333333;],所以删掉。然后取下一条,其[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]又是[/size][size=11.5pt;" lang="EN-US]10[/size][size=11.5pt; font-family: 宋体; color: #333333;],也删掉。以此类推。[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]2[/size][size=11.5pt; font-family: 宋体; color: #333333;])什么[/size][size=11.5pt;" lang="EN-US]rownum >1[/size][size=11.5pt; font-family: 宋体; color: #333333;]时查不到一条记录,而[/size] [size=11.5pt;" lang="EN-US]rownum >0[/size][size=11.5pt; font-family: 宋体; color: #333333;]或[/size][size=11.5pt;" lang="EN-US]rownum >=1[/size] [size=11.5pt; font-family: 宋体; color: #333333;]却总显示所有记录。[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]3[/size][size=11.5pt; font-family: 宋体; color: #333333;])为什么[/size][size=11.5pt;" lang="EN-US]between 1 and 10[/size] [size=11.5pt; font-family: 宋体; color: #333333;]或者[/size] [size=11.5pt;" lang="EN-US]between 0 and 10[/size] [size=11.5pt; font-family: 宋体; color: #333333;]能查到结果,而用[/size] [size=11.5pt;" lang="EN-US]between 2 and 10[/size] [size=11.5pt; font-family: 宋体; color: #333333;]却得不到结果。[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]从上可得[/size][size=11.5pt;" lang="EN-US],[/size][size=11.5pt; font-family: 宋体; color: #333333;]任何时候想把[/size][size=11.5pt;" lang="EN-US]rownum = 1[/size][size=11.5pt; font-family: 宋体; color: #333333;]这条记录抛弃是不对的。它在结果集中是不可或缺的。[/size]
[size=11.5pt;" lang="EN-US]
[/size][size=11.5pt; font-family: 宋体; color: #333333;]三、一些[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]实际运用的例子:[/size]
[size=11.5pt;" lang="EN-US] -----------
--sql[/size][size=11.5pt; font-family: 宋体; color: #333333;]建表脚本[/size]
[size=11.5pt;" lang="EN-US] create table LOADDATA
(
ID VARCHAR2(50),
AGE VARCHAR2(50),
NAME VARCHAR2(50)
);
-----------[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]如果希望找到[/size][size=11.5pt;" lang="EN-US]loaddata[/size][size=11.5pt; font-family: 宋体; color: #333333;]表中第一条记录的信息,可以使用[/size][size=11.5pt;" lang="EN-US]rownum=1[/size][size=11.5pt; font-family: 宋体; color: #333333;]作为条件。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]因为[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]都是从[/size][size=11.5pt;" lang="EN-US]“1”[/size][size=11.5pt; font-family: 宋体; color: #333333;]开始。[/size]
[size=11.5pt;" lang="EN-US]
select rownum,id,age,name
from loaddata
where rownum = 1; --[/size][size=11.5pt; font-family: 宋体; color: #333333;]可以用在限制返回记录条数的地方,保证不出错,如:隐式游标。[/size]
[size=11.5pt;" lang="EN-US]
SQL>select rownum,id,age,name from loaddata where rownum = 1;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA[/size]
[size=11.5pt;" lang="EN-US]
SQL>select rownum,id,age,name from loaddata where rownum = 2;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]注:[/size][size=11.5pt;" lang="EN-US]SQL>select rownum,id,age,name from loaddata where rownum != 3; --[/size][size=11.5pt; font-family: 宋体; color: #333333;]返回的是前[/size][size=11.5pt;" lang="EN-US]2[/size][size=11.5pt; font-family: 宋体; color: #333333;]条记录。[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200002 22 BBB[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]2[/size][size=11.5pt; font-family: 宋体; color: #333333;])[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]对于大于某值的查询条件[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]原因是由于[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]是一个总是从[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]开始的伪列,[/size][size=11.5pt;" lang="EN-US]Oracle[/size] [size=11.5pt; font-family: 宋体; color: #333333;]认为[/size][size=11.5pt;" lang="EN-US]rownum> n(n>1[/size][size=11.5pt; font-family: 宋体; color: #333333;]的自然数[/size][size=11.5pt;" lang="EN-US])[/size][size=11.5pt; font-family: 宋体; color: #333333;]这种条件依旧不成立,所以查不到记录。[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]那如何才能找到第二行以后的记录?[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]注意子查询中的[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]必须要有别名,否则仍然会查不到记录,这是因为[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]不是某个表的列。[/size]
[size=11.5pt;" lang="EN-US]
SQL>select rownum,id,age,name from(select rownum no ,id,age,name from loaddata) where no > 2;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
3 200003 22 CCC
4 200004 22 DDD
5 200005 22 EEE
6 200006 22 AAA[/size]
[size=11.5pt;" lang="EN-US]
SQL>select * from(select rownum,id,age,name from loaddata) where rownum > 2;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]3[/size][size=11.5pt; font-family: 宋体; color: #333333;])[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]对于小于某值的查询条件[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]显然[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]对于[/size][size=11.5pt;" lang="EN-US]rownum[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200002 22 BBB[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]综上几种情况:[/size]
[size=11.5pt;" lang="EN-US] rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]对于大于某值的查询条件直接认为是[/size][size=11.5pt;" lang="EN-US]false[/size][size=11.5pt; font-family: 宋体; color: #333333;]的,但是可以间接的让它转为认为是[/size][size=11.5pt;" lang="EN-US]true[/size][size=11.5pt; font-family: 宋体; color: #333333;]的,那就必须使用子查询。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]然后在主查询中判断新的[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]的[/size][size=11.5pt;" lang="EN-US]“[/size][size=11.5pt; font-family: 宋体; color: #333333;]别名列[/size][size=11.5pt;" lang="EN-US]”[/size][size=11.5pt; font-family: 宋体; color: #333333;]大于等于二的记录行。但是这样的操作会在大数据集中影响到检索速度。[/size]
[size=11.5pt;" lang="EN-US]
SQL>select * from (select rownum no,id,age,name from loaddata where rownum = 2; --[/size][size=11.5pt; font-family: 宋体; color: #333333;]必须是里小外大[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
2 200002 22 BBB
3 200003 22 CCC[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]也可以用这种方法实现[/size][size=11.5pt;" lang="EN-US]:[/size]
[size=11.5pt;" lang="EN-US] SQL>select rownum,id,age,name from loaddata where rownum [size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]([/size][size=11.5pt;" lang="EN-US]4[/size][size=11.5pt; font-family: 宋体; color: #333333;])[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]和排序[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]前提条件:[/size][size=11.5pt;" lang="EN-US]loaddata[/size][size=11.5pt; font-family: 宋体; color: #333333;]表中已经[/size][size=11.5pt;" lang="EN-US]insert[/size][size=11.5pt; font-family: 宋体; color: #333333;]了[/size][size=11.5pt;" lang="EN-US]5[/size][size=11.5pt; font-family: 宋体; color: #333333;]条记录,最后一条记录[/size][size=11.5pt;" lang="EN-US]id[/size][size=11.5pt; font-family: 宋体; color: #333333;]是[/size][size=11.5pt;" lang="EN-US]200005[/size][size=11.5pt; font-family: 宋体; color: #333333;],接着[/size][size=11.5pt;" lang="EN-US]insert into loaddata values('200006','22','AAA');[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200002 22 BBB
3 200003 22 CCC
4 200004 22 DDD
5 200005 22 EEE
6 200006 22 AAA[/size]
[size=11.5pt;" lang="EN-US]
SQL>select rownum ,id,age,name from loaddata order by name;[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
6 200006 22 AAA
2 200002 22 BBB
3 200003 22 CCC
4 200004 22 DDD
5 200005 22 EEE[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]系统是按照记录插入时的顺序给记录排的号,[/size][size=11.5pt;" lang="EN-US]rowid[/size][size=11.5pt; font-family: 宋体; color: #333333;]也是顺序分配的。[/size]
[size=11.5pt;" lang="EN-US] SQL>select rownum ,id,age,name from (select * from loaddata order by name);[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
1 200001 22 AAA
2 200006 22 AAA
3 200002 22 BBB
4 200003 22 CCC
5 200004 22 DDD
6 200005 22 EEE[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]这样就成了按[/size][size=11.5pt;" lang="EN-US]name[/size][size=11.5pt; font-family: 宋体; color: #333333;]排序,并且用[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]标出正确序号(有小到大)。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]同样,返回中间的记录集:[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
3 200002 22 BBB
4 200003 22 CCC[/size]
[size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]一般业务需求中,是需要先排序后,再返回中间记录集:[/size]
[size=11.5pt;" lang="EN-US] ROWNUM ID AGE NAME
------- ------ --- ------
3 200002 22 BBB
4 200003 22 CCC[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]注意此时的[/size][size=11.5pt;" lang="EN-US]SQL[/size][size=11.5pt; font-family: 宋体; color: #333333;]语句写法,使用了多重(三层)嵌套。同时注意:[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]使用了[/size][size=11.5pt;" lang="EN-US]“[/size][size=11.5pt; font-family: 宋体; color: #333333;]列别名[/size][size=11.5pt;" lang="EN-US]”[/size][size=11.5pt; font-family: 宋体; color: #333333;]。[/size][size=11.5pt;" lang="EN-US]
[/size] [size=11.5pt; font-family: 宋体; color: #333333;]实际上,该语句也是[/size][size=11.5pt;" lang="EN-US]Oracle[/size][size=11.5pt; font-family: 宋体; color: #333333;]数据集一个经典的[/size][size=11.5pt;" lang="EN-US]SQL[/size][size=11.5pt; font-family: 宋体; color: #333333;]语句分页算法:先排序,再选择[/size][size=11.5pt;" lang="EN-US]rownum [/size] [size=11.5pt; font-family: 宋体; color: #333333;]某页的最小值。[/size]
[size=11.5pt; font-family: 宋体; color: #333333;]四、一个实例:[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]解:[/size][size=11.5pt;" lang="EN-US]rownum[/size][size=11.5pt; font-family: 宋体; color: #333333;]是伪列,在表里没有,数据库先是执行[/size][size=11.5pt;" lang="EN-US]from book[/size][size=11.5pt; font-family: 宋体; color: #333333;]遍历[/size][size=11.5pt;" lang="EN-US]book[/size][size=11.5pt; font-family: 宋体; color: #333333;]表。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]如果有[/size] [size=11.5pt;" lang="EN-US]where[/size][size=11.5pt; font-family: 宋体; color: #333333;]条件,则不符合条件的就会从第一个结果集中删除,后面的数据继续加进来判断。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]可以用一个子查询来解决这个问题:对于[/size][size=11.5pt;" lang="EN-US]select rownum,id from book where rownum=2;[/size] [size=11.5pt; font-family: 宋体; color: #333333;]是查不出数据来的。[/size]
[size=11.5pt;" lang="EN-US]
declare
v_number binary_integer;
v_student student%rowtype;
begin
select count(*) into v_number from student;
for i in 1..v_number loop
select id,name,age into v_student from ( select rownum rn,id,name,age from student ) where rn=i;
dbms_output.put_line('id: '||v_student.id||' name:'||v_student.name);
end loop;
end;[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]简单的说[/size] [size=11.5pt;" lang="EN-US]rownum[/size] [size=11.5pt; font-family: 宋体; color: #333333;]是对符合条件结果的序列号。[/size]
[size=11.5pt;" lang="EN-US] [/size] [size=11.5pt; font-family: 宋体; color: #333333;]它总是从[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]开始排起的。所以,选出的结果不可能没有[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;],反而有其他大于[/size][size=11.5pt;" lang="EN-US]1[/size][size=11.5pt; font-family: 宋体; color: #333333;]的值。[/size]
[/align]
博客已转移至 http://blog.yemou.net/