【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

posted @   逆火狂飙  阅读(47)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2019-12-31 【Oracle】Count(*) 与 count(field) 结果会一样吗?
2019-12-31 Explain Plan试分析
2019-12-31 Oracle SQL Developer中查看解释计划Explain Plan的两种方法
2019-12-31 借助rownum中求Oracle表中前三名(三甲:状元榜眼探花)的方法(总计三种方法,以讲述rownum的使用为主)
2019-12-31 莫名其妙的Explain Plan
2019-12-31 我的T440p出现怪事情了
2017-12-31 x为正变数,求y=x^3/(x^4+4)的最大值
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示