zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    一本通1559跳跳棋
    一本通1558聚会
    一本通1555【例 4】次小生成树
    P1880 [NOI1995]石子合并
    P2066 机器分配
    P2073 送花
    P1886 滑动窗口
    P1637 三元上升子序列
    P1533 可怜的狗狗
    P1631 序列合并
  • 原文地址:https://www.cnblogs.com/heyang78/p/15750685.html
Copyright © 2011-2022 走看看