【Oracle】传统分页方案之二


先把结论抛出来:

select * from (select tta.*,rownum as rn from (
    select * from emp7 order by name
) tta where rownum<=【end】 ) ttb where ttb.rn>【start】

说明:

绿色部分 :固定代码,基本无需修改

红色部分:中间SQL需要替换成您自己的业务代码

                【start】:起始记录行

                【end'】:结束记录行

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

tta,ttb:为了防止固定代码与子查询中常见的别名a,b,c重名而特意采取的命名,这也是框架代码对业务代码的预判性避让。

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

为了验证上面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,234,5五条数据

第二页 start=5 end=10,有6,789,10五条数据

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

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

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

第一页:

select * from (select tta.*,rownum as rn from (
    select * from emp7 order by name
) tta where rownum<=5 ) ttb where ttb.rn>0

        ID NAME                                             RN
---------- ---------------------------------------- ----------
         1 Andy                                              1
         2 Bill                                              2
         3 Cindy                                             3
         4 Douglas                                           4
         5 Eliot                                             5

第二页:

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

第三页:

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

第四页:

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

可以发现,实际运行结果不仅符合预期,而且和 是完全一致的,两种方案可以相互验证。

到这里,可以说两种分页方案都能达到分页的目的,究竟哪种更优呢?请听下回分解。

END

相关