如何在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