分页控件的sql语句是这样,分页大小是20
第一页sql
select c.*
from (select b.*,rownum as rownums
from (select a.*
from P010B001.V_IB_RECOGNIZE_INFO a
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime DESC) b
where rownum <= 20) c
where rownums >= 1
and rownums <= 20
结果是
zhqzhqzhq 2009-10-28
北碚万寿都市工业园 2009-7-2
北碚同兴都市工业园 2009-7-1
涪陵北涛乌江都市工业园 2009-6-29
山洞都市工业园 2009-6-26
西永都市工业园 2009-6-25
茅山峡都市工业园 2009-6-25
长寿川染化工都市工业园 2009-6-25
垫江澄溪都市工业园 2009-6-6
大渡口八桥都市工业园 2009-6-6
南岸丹桂都市工业园 2009-6-6
铜梁欧旺都市工业园 2009-6-6
渝中区汇源都市工业园 2009-6-6
潼南县哨楼都市工业园 2009-6-6
九龙坡九里都市工业园 2009-6-6
北碚银钢都市工业园 2009-6-6
江北茂源都市工业园 2009-6-6
江北阿波罗都市工业园 2009-6-6
綦江诚智都市工业楼宇 2009-6-6
南川安坪都市工业园 2009-6-6
第二页sql
select e.*
from (select d.*,
rownum as rownums
from (select *
from P010B001.V_IB_RECOGNIZE_INFO
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime DESC) d
where rownum <= 40) e
where rownums >= 21
and rownums <= 40
结果是
九龙坡九里都市工业园 2009-6-6
北碚银钢都市工业园 2009-6-6
江北茂源都市工业园 2009-6-6
渝中区盛迪亚都市工业楼宇 2009-6-6
江北乾鑫都市工业园 2009-6-6
巴南建金都市工业园 2009-6-6
巴南维阳都市工业园 2009-6-6
南川南城庆岩都市工业园 2009-6-6
江北永腾都市工业园 2009-6-6
南岸白鹤都市工业园 2009-6-6
江北阿波罗都市工业园 2009-6-6
綦江诚智都市工业楼宇 2009-6-6
南川安坪都市工业园 2009-6-6
綦江标王都市工业楼宇 2009-6-6
涪陵鹅颈关都市工业园 2009-6-6
龙塔都市工业楼宇 2009-6-6
南岸皓月都市工业楼宇 2009-6-6
需要说明是CreateTime 这一列,时间用很多是一样的,这样导致了分页后有些数据无法查询出来,如:(璧山西部鞋都都市工业园 2009-6-6)查不出来
所有数据如下
zhqzhqzhq 2009-10-28
北碚万寿都市工业园 2009-7-2
北碚同兴都市工业园 2009-7-1
涪陵北涛乌江都市工业园 2009-6-29
山洞都市工业园 2009-6-26
西永都市工业园 2009-6-25
茅山峡都市工业园 2009-6-25
长寿川染化工都市工业园 2009-6-25
垫江澄溪都市工业园 2009-6-6
大渡口八桥都市工业园 2009-6-6
南岸丹桂都市工业园 2009-6-6
铜梁欧旺都市工业园 2009-6-6
渝中区汇源都市工业园 2009-6-6
潼南县哨楼都市工业园 2009-6-6
巴南先锋都市工业园 2009-6-6
荣昌佳旺都市工业楼宇 2009-6-6
荣昌汇宇都市工业楼园 2009-6-6
璧山西部鞋都都市工业园 2009-6-6
九龙坡海龙都市工业园 2009-6-6
渝中区中安国际都市工业园 2009-6-6
九龙坡九里都市工业园 2009-6-6
北碚银钢都市工业园 2009-6-6
江北茂源都市工业园 2009-6-6
渝中区盛迪亚都市工业楼宇 2009-6-6
江北乾鑫都市工业园 2009-6-6
巴南建金都市工业园 2009-6-6
巴南维阳都市工业园 2009-6-6
南川南城庆岩都市工业园 2009-6-6
江北永腾都市工业园 2009-6-6
南岸白鹤都市工业园 2009-6-6
江北阿波罗都市工业园 2009-6-6
綦江诚智都市工业楼宇 2009-6-6
南川安坪都市工业园 2009-6-6
綦江标王都市工业楼宇 2009-6-6
涪陵鹅颈关都市工业园 2009-6-6
龙塔都市工业楼宇 2009-6-6
南岸皓月都市工业楼宇 2009-6-6
请问如何解决?
第一页sql
select c.*
from (select b.*,rownum as rownums
from (select a.*
from P010B001.V_IB_RECOGNIZE_INFO a
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime DESC) b
where rownum <= 20) c
where rownums >= 1
and rownums <= 20
结果是
zhqzhqzhq 2009-10-28
北碚万寿都市工业园 2009-7-2
北碚同兴都市工业园 2009-7-1
涪陵北涛乌江都市工业园 2009-6-29
山洞都市工业园 2009-6-26
西永都市工业园 2009-6-25
茅山峡都市工业园 2009-6-25
长寿川染化工都市工业园 2009-6-25
垫江澄溪都市工业园 2009-6-6
大渡口八桥都市工业园 2009-6-6
南岸丹桂都市工业园 2009-6-6
铜梁欧旺都市工业园 2009-6-6
渝中区汇源都市工业园 2009-6-6
潼南县哨楼都市工业园 2009-6-6
九龙坡九里都市工业园 2009-6-6
北碚银钢都市工业园 2009-6-6
江北茂源都市工业园 2009-6-6
江北阿波罗都市工业园 2009-6-6
綦江诚智都市工业楼宇 2009-6-6
南川安坪都市工业园 2009-6-6
第二页sql
select e.*
from (select d.*,
rownum as rownums
from (select *
from P010B001.V_IB_RECOGNIZE_INFO
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime DESC) d
where rownum <= 40) e
where rownums >= 21
and rownums <= 40
结果是
九龙坡九里都市工业园 2009-6-6
北碚银钢都市工业园 2009-6-6
江北茂源都市工业园 2009-6-6
渝中区盛迪亚都市工业楼宇 2009-6-6
江北乾鑫都市工业园 2009-6-6
巴南建金都市工业园 2009-6-6
巴南维阳都市工业园 2009-6-6
南川南城庆岩都市工业园 2009-6-6
江北永腾都市工业园 2009-6-6
南岸白鹤都市工业园 2009-6-6
江北阿波罗都市工业园 2009-6-6
綦江诚智都市工业楼宇 2009-6-6
南川安坪都市工业园 2009-6-6
綦江标王都市工业楼宇 2009-6-6
涪陵鹅颈关都市工业园 2009-6-6
龙塔都市工业楼宇 2009-6-6
南岸皓月都市工业楼宇 2009-6-6
需要说明是CreateTime 这一列,时间用很多是一样的,这样导致了分页后有些数据无法查询出来,如:(璧山西部鞋都都市工业园 2009-6-6)查不出来
所有数据如下
zhqzhqzhq 2009-10-28
北碚万寿都市工业园 2009-7-2
北碚同兴都市工业园 2009-7-1
涪陵北涛乌江都市工业园 2009-6-29
山洞都市工业园 2009-6-26
西永都市工业园 2009-6-25
茅山峡都市工业园 2009-6-25
长寿川染化工都市工业园 2009-6-25
垫江澄溪都市工业园 2009-6-6
大渡口八桥都市工业园 2009-6-6
南岸丹桂都市工业园 2009-6-6
铜梁欧旺都市工业园 2009-6-6
渝中区汇源都市工业园 2009-6-6
潼南县哨楼都市工业园 2009-6-6
巴南先锋都市工业园 2009-6-6
荣昌佳旺都市工业楼宇 2009-6-6
荣昌汇宇都市工业楼园 2009-6-6
璧山西部鞋都都市工业园 2009-6-6
九龙坡海龙都市工业园 2009-6-6
渝中区中安国际都市工业园 2009-6-6
九龙坡九里都市工业园 2009-6-6
北碚银钢都市工业园 2009-6-6
江北茂源都市工业园 2009-6-6
渝中区盛迪亚都市工业楼宇 2009-6-6
江北乾鑫都市工业园 2009-6-6
巴南建金都市工业园 2009-6-6
巴南维阳都市工业园 2009-6-6
南川南城庆岩都市工业园 2009-6-6
江北永腾都市工业园 2009-6-6
南岸白鹤都市工业园 2009-6-6
江北阿波罗都市工业园 2009-6-6
綦江诚智都市工业楼宇 2009-6-6
南川安坪都市工业园 2009-6-6
綦江标王都市工业楼宇 2009-6-6
涪陵鹅颈关都市工业园 2009-6-6
龙塔都市工业楼宇 2009-6-6
南岸皓月都市工业楼宇 2009-6-6
请问如何解决?
from (
select row_number() over(order by a.CreateTime DESC) rn,
a.*
from P010B001.V_IB_RECOGNIZE_INFO a
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
) t
where t.rn > 1
and t.rn <= 20;
对的,我的数据一共只用37条,所以只用17条记录
学习下,好像有个parttition的东东,请教下是否在大数据量的情况下效率更高啊?
from P010B001.V_IB_RECOGNIZE_INFO a
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime desc, name
row_number并不能解决这样的问题。如果排序先按时间排,再按rowid排应该会避免这种情况。
order by createtime desc, rowid;
select d.*,
rownum as rownums
from (select *
from P010B001.V_IB_RECOGNIZE_INFO
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime DESC) d
where rownum <= 40
与
select d.*,
rownum as rownums
from (select *
from P010B001.V_IB_RECOGNIZE_INFO
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime DESC) d
where rownum <= 20
为什么不同了
不同的session中执行都是那一条不出来,还是在同一个session里面执行多次?
select d.*,
rownum as rownums
from (select *
from P010B001.V_IB_RECOGNIZE_INFO
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime DESC) d
where rownum <= 40
这个每次顺序应该不一样吧
select c.*
from (select a.* ,row_number()over(order by CreateTime DESC)rownums
from P010B001.V_IB_RECOGNIZE_INFO a
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
) c
where rownums >= 1
and rownums <= 20
试试,第二页语句一样,改where rownums..后面的数字
看看还会不会出现这种情况
当排序使用的列出现重复的时候,用rownum可能会有一些问题,因为两次排序很可能结果不同。
而且用row_number()代替rownum,本机上测试,前者性能要优于后者
第一页sql
select a.ibname,a.createtime,a.rownums
from (
select c.*,row_number()over(order by CreateTime DESC) as rownums
from p010b001.v_ib_recognize_info c
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')) a where rownums <= 20
结果如下:
ibname time rownums
qy00125 2009-10-28 1
重庆市万寿都市工业园 2009-7-2 2
同兴都市工业园 2009-7-1 3
涪陵白涛乌江都市工业园 2009-6-29 4
沙坪坝区山洞都市工业园 2009-6-26 5
重庆西永都市工业园 2009-6-25 6
重庆市茅山峡都市工业园 2009-6-25 7
长寿区川染都市工业园 2009-6-25 8
垫江澄溪都市工业园 2009-6-6 9
八桥科技都市工业园 2009-6-6 10
南岸丹桂都市工业园 2009-6-6 11
铜梁县欧旺都市工业园 2009-6-6 12
渝中区汇源都市工业楼宇 2009-6-6 13
潼南哨楼都市工业园 2009-6-6 14
渝中区中安国际都市工业楼宇 2009-6-6 15
重庆市九龙坡区九里都市工业园 2009-6-6 16
重庆银钢都市工业园 2009-6-6 17
重庆市茂源都市工业园 2009-6-6 18
重庆市阿波罗都市工业园 2009-6-6 19
重庆市诚智都市工业园 2009-6-6 20
第二页sql
select a.ibname,a.createtime,a.rownums
from (
select c.*,row_number()over(order by CreateTime DESC) as rownums
from p010b001.v_ib_recognize_info c
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')) a where rownums <= 40 and rownums>=21
结果如下:重庆市九龙坡区九里都市工业园 2009-6-6 21
重庆银钢都市工业园 2009-6-6 22
重庆市茂源都市工业园 2009-6-6 23
渝中区盛迪亚都市工业楼宇 2009-6-6 24
重庆市乾鑫都市工业园 2009-6-6 25
巴南区建金都市工业园 2009-6-6 26
重庆市维阳食品工业园 2009-6-6 27
南川区南城庆岩都市工业园 2009-6-6 28
重庆市永腾都市工业园 2009-6-6 29
南岸白鹤都市工业园 2009-6-6 30
重庆市阿波罗都市工业园 2009-6-6 31
重庆市诚智都市工业园 2009-6-6 32
南川区安坪都市工业园 2009-6-6 33
标王都市工业园 2009-6-6 34
涪陵鹅颈关都市工业园 2009-6-6 35
重庆龙塔都市工业楼宇 2009-6-6 36
重庆皓月都市工业楼宇 2009-6-6 37
结果还是不对头,比如(重庆市茂源都市工业园 2009-6-6 18
有重复,璧山西部鞋都都市工业园 2009-6-6 还是没出来)
sql1:
select *
from (select a.*, rownum as rownums
from (select *
from p010b001.v_ib_recognize_info c
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd') order by c.CREATETIME desc) a
)
where rownums <=20
结果:
qy00125 2009-10-28
重庆市万寿都市工业园 2009-7-2
同兴都市工业园 2009-7-1
涪陵白涛乌江都市工业园 2009-6-29
沙坪坝区山洞都市工业园 2009-6-26
重庆西永都市工业园 2009-6-25
重庆市茅山峡都市工业园 2009-6-25
长寿区川染都市工业园 2009-6-25
垫江澄溪都市工业园 2009-6-6
八桥科技都市工业园 2009-6-6
南岸丹桂都市工业园 2009-6-6
铜梁县欧旺都市工业园 2009-6-6
渝中区汇源都市工业楼宇 2009-6-6
潼南哨楼都市工业园 2009-6-6
重庆市先锋都市工业园 2009-6-6
荣昌佳旺都市工业楼宇 2009-6-6
荣昌汇宇都市工业园 2009-6-6
重庆奥康都市工业楼宇 2009-6-6
九龙坡海龙都市工业园 2009-6-6
渝中区中安国际都市工业楼宇 2009-6-6
sql2:
select ibname,CREATETIME
from (select a.*, rownum as rownums
from (select *
from p010b001.v_ib_recognize_info c
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd') order by c.CREATETIME desc) a
)
where rownums <= 40
and rownums >= 21
结果:
重庆市九龙坡区九里都市工业园 2009-6-6
重庆银钢都市工业园 2009-6-6
重庆市茂源都市工业园 2009-6-6
渝中区盛迪亚都市工业楼宇 2009-6-6
重庆市乾鑫都市工业园 2009-6-6
巴南区建金都市工业园 2009-6-6
重庆市维阳食品工业园 2009-6-6
南川区南城庆岩都市工业园 2009-6-6
重庆市永腾都市工业园 2009-6-6
南岸白鹤都市工业园 2009-6-6
重庆市阿波罗都市工业园 2009-6-6
重庆市诚智都市工业园 2009-6-6
南川区安坪都市工业园 2009-6-6
标王都市工业园 2009-6-6
涪陵鹅颈关都市工业园 2009-6-6
重庆龙塔都市工业楼宇 2009-6-6
重庆皓月都市工业楼宇 2009-6-6
也就是在内层不指定 rownum
from (select d.*
from (select *
from P010B001.V_IB_RECOGNIZE_INFO
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd')
order by CreateTime DESC) d
where rownum <= 40) e
where rownums >= 21
and rownums <= 40;这样是正确的吗,就是吧d.*后面的rownum去掉
问题就出在 where rownum<范围
from (select a.*, rownum as rownums
from (select *
from p010b001.v_ib_recognize_info c
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd') order by c.CREATETIME desc) a
)
where rownums <= 40
and rownums >= 21
from (select a.*, rownum as rownums
from (select *
from p010b001.v_ib_recognize_info c
where CreateTime >= to_date('2009-1-1', 'yyyy-MM-dd')
and CreateTime < to_date('2010-1-1', 'yyyy-MM-dd') order by c.CREATETIME desc) a
)
where rownums <= 20