oracle中的分页

来源:互联网 发布:知乎 语音识别api 编辑:程序博客网 时间:2024/04/30 01:09

如何在Oracle里实现类似SQL Server里top语法的查询,例如查询结果集的前10条,查询结果集的第10到第20条?

使用子查询,并使用oracle的函数rownum,举例如下:

有一个用户表如下:

 

User ( UserID NUMBER ( 10 ) NOT NULL, Status NUMBER ( 3 ), Email VARCHAR2 ( 256 ) NOT NULL, UserName VARCHAR2 ( 256 ), Password VARCHAR2 ( 256 ), CONSTRAINT PK_User_1 PRIMARY KEY (UserID))
要求查询状态为1的按姓名排序的前10个用户,SQL如下:
  select * from (select a.*,rownum rn from User a where a.Status=1 order by a.UserName)    where rn<=10

做法就是将我们的查询放到一个子查询里,同时多查询一个结果,就是行数,使用rownum

然后在外面的查询里对行数做where条件,根据需要查询不同的结果集,如果是前10条就是rn<=10,如果是10~20条就是rn<20 and rn>=10,等等

执行上述SQL查询会发现取出的10个结果未必是按UserName排序后的前10条,这是因为oracle的rownum函数实际产生的是一个伪列,其行号并不是完全按照结果集的顺序,具有一定的随机性,所以需要对上述语句做一些修改,使用row_number()函数,如下:

  select * from (select a.*,row_number() over (order by a.UserName) rn from User a where a.Status=1)    where rn<=10
原创粉丝点击