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

  • 相关阅读:
    Linux笔记 三剑客之sed
    Linux笔记 用户组管理
    Linux实验之软件管理
    Linux实验之系统安装
    gd_t , bd_t 结构分析
    编辑linux内核与bosybox 时,make menuconfig 出现错误
    4412裸板开发 (1点灯)
    tiny4412SDK 1312B 启动ubuntuDsektop
    tiny4412 启动方式
    linux minitools+minicom 安装及使用
  • 原文地址:https://www.cnblogs.com/heyang78/p/15751235.html
Copyright © 2011-2022 走看看