【Oracle】Oracle传统分页方案之一

首先把最终SQL和盘托出:

select * from ( select ta.*,rownum as rn from ( 
    select * from emp7 order by name
)ta )tb where 【start】<tb.rn and tb.rn<=【end】

说明:

绿色部分:Oracle固定分页语句,基本不需要改动

红色部分:业务SQL,请根据您自己的业务进行调整。

                 【start】:起始行号,从0开始

                 【end】:结束行号

                  这两个基本是用户点击后传到后台的。

ta,tb: 这样命名是为了避免和业务SQL中常见的a,b重名,您还可以修改为tta,ttta之类的个性名称。

到这里,伸手党就可以离散了,较真党请继续往下看。

为了验证上面SQL的正确性,特创建一张表:

create table emp7(
    id number(3),
    name nvarchar2(20),
    primary key(id)
)

然后这样充值:

insert into emp7(id,name) values(1,'Andy');
insert into emp7(id,name) values(2,'Bill');
insert into emp7(id,name) values(3,'Cindy');
insert into emp7(id,name) values(4,'Douglas');
insert into emp7(id,name) values(5,'Eliot');
insert into emp7(id,name) values(6,'Felix');
insert into emp7(id,name) values(7,'Green');
insert into emp7(id,name) values(8,'Hilter');
insert into emp7(id,name) values(9,'Jack');
insert into emp7(id,name) values(10,'Tom');
insert into emp7(id,name) values(11,'Zerg');
insert into emp7(id,name) values(12,'宋江');
insert into emp7(id,name) values(13,'林冲');
insert into emp7(id,name) values(14,'鲁智深');
insert into emp7(id,name) values(15,'李逵');
insert into emp7(id,name) values(16,'武松');
insert into emp7(id,name) values(17,'吴用');

然后业务SQL是:

select * from emp7 order by name

结果是:

        ID NAME
---------- ----------------------------------------
         1 Andy
         2 Bill
         3 Cindy
         4 Douglas
         5 Eliot
         6 Felix
         7 Green
         8 Hilter
         9 Jack
        10 Tom
        11 Zerg
        17 吴用
        12 宋江
        15 李逵
        13 林冲
        16 武松
        14 鲁智深

如果我们以五条数据分一页,那么目测应该有

第一页  start=0 end=5, 有1,2,3,4,5五条数据

第二页 start=5 end=10,有6,7,8,9,10五条数据

第三页 start=10 end=15,有11,17,12,15,13五条数据

第四页 start=15 end=20,有16,14两条记录。

下面看看运行结果是否符合预期。

第一页:

select * from ( select ta.*,rownum as rn from ( 
    select * from emp7 order by name
)ta )tb where 0<tb.rn and tb.rn<=5
        ID NAME                                             RN
---------- ---------------------------------------- ----------
         1 Andy                                              1
         2 Bill                                              2
         3 Cindy                                             3
         4 Douglas                                           4
         5 Eliot                                             5

结论:第一页符合预期

第二页:

select * from ( select ta.*,rownum as rn from ( 
    select * from emp7 order by name
)ta )tb where 5<tb.rn and tb.rn<=10
        ID NAME                                             RN
---------- ---------------------------------------- ----------
         6 Felix                                             6
         7 Green                                             7
         8 Hilter                                            8
         9 Jack                                              9
        10 Tom                                              10

结论:第二页符合预期

第三页:

select * from ( select ta.*,rownum as rn from ( 
    select * from emp7 order by name
)ta )tb where 10<tb.rn and tb.rn<=15
        ID NAME                                             RN
---------- ---------------------------------------- ----------
        11 Zerg                                             11
        17 吴用                                             12
        12 宋江                                             13
        15 李逵                                             14
        13 林冲                                             15

结论:第三页符合预期

第四页:

select * from ( select ta.*,rownum as rn from ( 
    select * from emp7 order by name
)ta )tb where 15<tb.rn and tb.rn<=20
        ID NAME                                             RN
---------- ---------------------------------------- ----------
        16 武松                                             16
        14 鲁智深                                           17

结论:第四页符合预期

到这里,怀疑者也可以打消怀疑了,至少结果符合预期。

当然,目前还没有和其它分页方案比较,效率高低还不好说,这个就留待下回分解吧。

END

 PS:另一种传统分页方案请见 https://www.cnblogs.com/heyang78/p/15751235.html

原文地址:https://www.cnblogs.com/heyang78/p/15750685.html