Oracle中RowNum的用法

RowNum是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (先要有结果集)。
简单的说,RowNum 是对符合条件结果的序列号,它总是从1开始排起的。

实例1
Select TableId,TableData From TableName Where RowNum > 1 
以上语句没有查询记录。
因为第一条不满足去掉的话,第二条的RowNum又成了1,所以永远没有满足条件的记录。
或者可以这样理解:RowNum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则RowNum值为1,第二条为2,依次类推。因为从缓冲区或数据文件中得到的第一条记录的RowNum为1,则被删除,接着取下条,可是它的RowNum还是1,又被删除,依次类推,便没有了数据。

实例2
select TableId,TableData from TableName where RowNum < 10
select TableId,TableData from TableName where RowNum != 10
以上两条语句查询出来的记录相同。
因为是在查询到结果集后,显示完第9条记录后,之后的记录也都是 != 10,或者 >=10,所以只显示前面9条记录。
也可以这样理解,RowNum为9后的记录的RowNum为10,因条件为 !=10,所以去掉,其后记录补上,RowNum又是10,再被去掉,这样就只会显示前9条记录了。

实例3
Select TableId,TableData From TableName Where RowNum Between Number And 10
Number大于1时没有查询记录。原因同上(RowNum总是从1开始)。

实例4
如果就是想要用RowNum > 10这种条件的话就要用嵌套语句,把RowNum先生成,然后对它进行查询
Select * From
(Select RowNum as RN,TableId,TableData From TableName)
Where RN > 10
一般对结果集进行分页就是这样做的。

附:

关于别名:
Select TableId,TableData as 中文别名 From TableName Where 中文别名 Like '%NameKey%',会提示“‘中文别名’:标识符无效”
可以改成:
Select * From (Select TableId,TableData as 中文别名 From TableName) Where 中文别名 Like '%NameKey%'

关于排序:

Select UserId,UserName from BS_User where rownum<=6 order by UserId ASC
Select UserId,UserName from BS_User where rownum<=10 order by UserId ASC

Q:这两句的前六项为什么不一样?

A:把RowNum加入查询,可以看出记录的RowNum并不是按顺序排列,即RowNum是在排序之前产生的(据闻以记录插入顺序排的号)。如要实现按UserId排序后再取前N(10)条记录,可以用嵌套查询(先排序再取):

Select UserId,UserName From (Select UserId,UserName From BS_User Order By UserId ASC) Where RowNum <= 10

或者在Order By的字段上加索引。

参考文章:http://www.cnblogs.com/temptation/archive/2007/05/16/748897.html

 

补充:选择特定分类新闻的分页例子

select newsid,title,createdate
from( 
    select rownum as oindex,newsid,title,createdate
    from
    (
        select un.newsid,un.title,un.createdate from ui_news un
        inner join newstype nt on nt.newsid = un.newsid 
        where nt.typeid = :typeid and un.disable = 0 order by un.createdate desc  
    )
    where rownum < :oendindex
)
where oindex>= :ostartindex

 

 

posted @ 2009-08-24 15:25  DaCHun  阅读(2277)  评论(0编辑  收藏  举报