首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

Oracle的一个分页的有关问题,数据多时有重复

2013-12-19 
Oracle的一个分页的问题,数据多时有重复 当数据足够多的时候,点击上一页、下一页时,数据会出现重复的现象,

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


[解决办法]
引用:
 当数据足够多的时候,点击上一页、下一页时,数据会出现重复的现象,但是没有什么规律,数据极少时基本很难发现,但数据多时,在最后几页就比较明显,请各位帮忙分析下什么原因导致。。

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()。
[解决办法]
引用:
Quote: 引用:


有重复数据吧,这个和数据多少没有关系。分页条件最好用主键,或者自定义ROWNUM()。


目前老说,自定义rownum不可能了,实用统一的分页方法,不可能每个表都去加一列用来分页
最主要的是 内层的sql还有个按时间排序,我估摸着就是这个引起的

你可以先保证子查询的数据没有重复,然后作为子查询加上ROWNUM
[解决办法]
由于嵌套查询 order by(ORDER BY PRM.CREATEDDATE DESC) 的时候相同数据太多,查询出来分页有可能造成楼主这种情况。
可以修改为:

ORDER BY PRM.CREATEDDATE DESC,PRM.ID
--楼主id该是唯一的吧 -_-#

------解决方案--------------------


这个应该是排序字段不唯一,排序后,相同排序时rownum算法的问题。这个rownum算法不固定,有时asc后面不变,有时desc后面不变。
解决方法:order by xx,rowid;

热点排行