oracle不像mysql中有limit(n,m)来进行分页操作,我们需要使用oracle的ROWNUM字段来进行分页。
首先来了解一下ROWNUM
ROWNUM是oracle中的伪字段,用来返回查询记录的行号,第一行分配的是1,第二行是2,以此类推。
在对oracle进行分类是,我们可以将需要查询的表的ROWNUM显示表示,然后使用"ROWNUM >= 起始记录行号 and ROWNUM <= 结束记录行号"进行条件筛选。
这里用到项目中某个分页查询来举例,整体sql如下:
select ori_3.*
from (select ori_2.*, ROWNUM page_num
from (select *
from (select y.bm,
y.scqymc,
y.spmc,
y.jyzt,
y.mc,
y.gg,
y.zhxs,
y.zbjg,
y.jx,
(select info
from dictinfo
where typecode = '003'
and dictcode = y.jyzt) jyztmc
from ypxx y) ori_1
where ori_1.mc like '%片%') ori_2
where ROWNUM <= 10) ori_3
where ori_3.page_num >= 0;
我们进行层层拆分,由内而外结构如下:
1.最内层表有一个子查询,用来关联字典表来获得具体的数据,将查询结果命名为ori_1
select y.bm,
y.scqymc,
y.spmc,
y.jyzt,
y.mc,
y.gg,
y.zhxs,
y.zbjg,
y.jx,
(select info
from dictinfo
where typecode = '003'
and dictcode = y.jyzt) jyztmc
from ypxx y
2.对ori_1中的数据进行条件筛选,将查询结果命名为ori_2
select *
from ori_1
where ori_1.mc like '%片%'
3.取出ori_2中的ROWNUM,同时通过ROWNUM和当前页结尾行数来对数据进行切割,返回结果为ori_3
select ori_2.*, ROWNUM page_num
from ori_2
where ROWNUM <= 10)
4.通过page_num和当前页开始行数再次对数据进行切割,返回的结果就是当前页显示的记录合集
select ori_3.*
from ori_3
where ori_3.page_num >= 0;