Oracle的一个分页的问题,数据多时有重复
当数据足够多的时候,点击上一页、下一页时,数据会出现重复的现象,但是没有什么规律,数据极少时基本很难发现,但数据多时,在最后几页就比较明显,请各位帮忙分析下什么原因导致。。
SELECT *
FROM (SELECT T_.*, ROWNUM R_O_W_
FROM (select *
from (SELECT /*+FIRST_ROWS*/
PRMINPTYP.NAME AS PRMINPTYP_NAME,
PRM.SN AS PRM_SN,
PRM.NAME AS PRM_NAME,
PRMQTYPLAN.NAME AS PRMQTYPLAN_NAME,
PRMPDT.NAME AS PRMPDT_NAME,
PRM.MACHINES_NAME AS PRM_MACHINES_NAME,
PRM.USL AS PRM_USL,
PRM.TARGET AS PRM_TARGET,
PRM.LSL AS PRM_LSL,
PRM.USL_D AS PRM_USL_D,
PRM.TARGET_D AS PRM_TARGET_D,
PRM.LSL_D AS PRM_LSL_D,
PRMMEATYPE.NAME AS PRMMEATYPE_NAME,
PRMMEA.NAME AS PRMMEA_NAME,
PRM.OPPORTUNITY AS PRM_OPPORTUNITY,
PRMSAMPLINGID.NAME AS PRMSAMPLINGID_NAME,
PRM.EXCEPTIONFLAG AS PRM_EXCEPTIONFLAG,
PRM.PREFIX AS PRM_PREFIX,
PRM.id AS "id"
FROM TQ_PARAMETER PRM
LEFT JOIN TQ_INSPECTIONTYPE PRMINPTYP
ON PRM.INSPECTIONTYPE_ID = PRMINPTYP.ID
LEFT JOIN TQ_PLAN PRMQTYPLAN
ON PRM.PLAN_ID = PRMQTYPLAN.ID
LEFT JOIN TP_PRODUCT PRMPDT
ON PRM.PRODUCT_ID = PRMPDT.ID
LEFT JOIN TM_MEASURETYPE PRMMEATYPE
ON PRM.MEASURETYPE = PRMMEATYPE.ID
LEFT JOIN TM_MEASURE PRMMEA
ON PRM.MEASURE_ID = PRMMEA.ID
LEFT JOIN TPL_SAMPLING PRMSAMPLINGID
ON PRM.SAMPLING_ID = PRMSAMPLINGID.ID
where (PRM.ftype = '1000')
ORDER BY PRM.CREATEDDATE DESC)
WHERE (1 = 1 AND ROWNUM <= 43435)) T_)
WHERE R_O_W_ > 43400
[解决办法]
有重复数据吧,这个和数据多少没有关系。分页条件最好用主键,或者自定义ROWNUM()。
[解决办法]
你可以先保证子查询的数据没有重复,然后作为子查询加上ROWNUM
[解决办法]
由于嵌套查询 order by(ORDER BY PRM.CREATEDDATE DESC) 的时候相同数据太多,查询出来分页有可能造成楼主这种情况。
可以修改为:
ORDER BY PRM.CREATEDDATE DESC,PRM.ID
--楼主id该是唯一的吧 -_-#
------解决方案--------------------
这个应该是排序字段不唯一,排序后,相同排序时rownum算法的问题。这个rownum算法不固定,有时asc后面不变,有时desc后面不变。
解决方法:order by xx,rowid;