【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