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