【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
分类:
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)
2017-12-30 【转载】史海拾遗:外国观察者笔下的明朝军队兴衰
2017-12-30 常用文本特殊符号如数学符号物理符号序号罗马字希腊字等的搜集整理(可拷贝,文本文件中亦可用)
2017-12-30 猜想:一组勾股数a^2+b^2=c^2中,a,b之一必为4的倍数。
2015-12-30 【canvas技法】使用HTML5/Canvas绘制蓝色六边形网格