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

  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/heyang78/p/15751235.html
Copyright © 2011-2022 走看看