【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,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 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
分类:
Oracle.分页
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)的最大值