日期:2014-05-17  浏览次数:20866 次

2条分页,求差别,结果不一样,rownum注意什么地方
select * from (select my_table.*,rownum as my_rownum from( 
select a.PROD_OFFER_ID,a.EXT_PROD_OFFER_ID,a.PROD_OFFER_NAME,a.ALIAS_NAME,
a.BRAND_ID,sb.BRAND_NAME,sp.sales_price,sp.org_price,sp.discount,sp.pref_price,
sd.offer_desc,sd.view_counts,sd.start_date,sd.templet_id,ph.picture_id,pic.picture_name,
pic.path_url,pic.version_no from S_PROD_OFFER a left join S_BRAND sb on a.brand_id=sb.brand_id
left join S_PROD_OFFER_PRICE sp on a.prod_offer_id=sp.prod_offer_id left join S_PROD_OFFER_DETAIL sd
on a.prod_offer_id=sd.prod_offer_id left join S_PICTURE_OBJECT_REL ph on ph.object_id=a.prod_offer_id
and ph.object_type='003' and ph.position_id=1 left join S_PICTURE pic on ph.picture_id=pic.picture_id
where a.state='00A' and a.OFFER_TYPE='100'
order by SALES_PRICE asc
)my_table where rownum< 5) where my_rownum>= 2;
 
 select * from (select rownum r, t.* from (
select a.PROD_OFFER_ID,a.EXT_PROD_OFFER_ID,a.PROD_OFFER_NAME,a.ALIAS_NAME,
a.BRAND_ID,sb.BRAND_NAME,sp.sales_price,sp.org_price,sp.discount,sp.pref_price,
sd.offer_desc,sd.view_counts,sd.start_date,sd.templet_id,ph.picture_id,pic.picture_name,
pic.path_url,pic.version_no from S_PROD_OFFER a left join S_BRAND sb on a.brand_id=sb.brand_id
left join S_PROD_OFFER_PRICE sp on a.prod_offer_id=sp.prod_offer_id left join S_PROD_OFFER_DETAIL sd
on a.prod_offer_id=sd.prod_offer_id left join S_PICTURE_OBJECT_REL ph on ph.object_id=a.prod_offer_id
and ph.object_type='003' and ph.position_id=1 left join S_PICTURE pic on ph.picture_id=pic.picture_id
where a.state='00A' and a.OFFER_TYPE='100'
order by SALES_PRICE asc )t )where r>1 and r<=4;

2条分页的结果不一样,中级部分是一样的

------解决方案--------------------
rownum在非主键或索引键排序选出时,一定要先在子查询中排序,然后用rownum再选出,因此时的rownum是按主键或索引键排序生成的,并不是按你的排序字段生成的

但你上面的写法,如果子查询一样,结果必一样。
可否将你选的数据列出来,看下哪里有不一样的,我实在不信他会不一样。
------解决方案--------------------
order by SALES_PRICE asc 

你再加一个排序条件,比如PROD_OFFER_ID,那结果应该就一样了。

因为第一种与第二种手机单价是一样的。
------解决方案--------------------
第一句中的 where rownum< 5 是对my_table 表而言,rownum作为临时表的特殊字段。
where rownum< 5 只会取临时表的前5个,并非真正在结果集中去取。
分页建议用第二种方法,那样才能实现分页的真正的意义。
------解决方案--------------------
rownum<=5和order用在同一层的效果是: 取得自然顺序的前5条,然后再排序。
------解决方案--------------------
使用rownum的時候注意一個別名,跟子查詢就可以!