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

枫欢 2013-12-09 12:04:03
当数据足够多的时候,点击上一页、下一页时,数据会出现重复的现象,但是没有什么规律,数据极少时基本很难发现,但数据多时,在最后几页就比较明显,请各位帮忙分析下什么原因导致。。

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
...全文
381 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
CT_LXL 2013-12-09
  • 打赏
  • 举报
回复
引用 楼主 xiaomahuan 的回复:
当数据足够多的时候,点击上一页、下一页时,数据会出现重复的现象,但是没有什么规律,数据极少时基本很难发现,但数据多时,在最后几页就比较明显,请各位帮忙分析下什么原因导致。。
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
最里面的子查询有重复数据
shenlele088 2013-12-09
  • 打赏
  • 举报
回复
这个应该是排序字段不唯一,排序后,相同排序时rownum算法的问题。这个rownum算法不固定,有时asc后面不变,有时desc后面不变。 解决方法:order by xx,rowid;
  • 打赏
  • 举报
回复
由于嵌套查询 order by(ORDER BY PRM.CREATEDDATE DESC) 的时候相同数据太多,查询出来分页有可能造成楼主这种情况。 可以修改为:

ORDER BY PRM.CREATEDDATE DESC,PRM.ID
--楼主id该是唯一的吧 -_-#
CT_LXL 2013-12-09
  • 打赏
  • 举报
回复
引用 5 楼 xiaomahuan 的回复:
[quote=引用 2 楼 u010192842 的回复:] 有重复数据吧,这个和数据多少没有关系。分页条件最好用主键,或者自定义ROWNUM()。
目前老说,自定义rownum不可能了,实用统一的分页方法,不可能每个表都去加一列用来分页 最主要的是 内层的sql还有个按时间排序,我估摸着就是这个引起的[/quote] 你可以先保证子查询的数据没有重复,然后作为子查询加上ROWNUM
枫欢 2013-12-09
  • 打赏
  • 举报
回复
引用 2 楼 u010192842 的回复:
有重复数据吧,这个和数据多少没有关系。分页条件最好用主键,或者自定义ROWNUM()。
目前老说,自定义rownum不可能了,实用统一的分页方法,不可能每个表都去加一列用来分页 最主要的是 内层的sql还有个按时间排序,我估摸着就是这个引起的
枫欢 2013-12-09
  • 打赏
  • 举报
回复
引用 楼主 xiaomahuan 的回复:
最里面的子查询有重复数据
求改造~~
shenlele088 2013-12-09
  • 打赏
  • 举报
回复
distinct or 若感觉太慢,可以 先列出分段id,然后id between and
Yole 2013-12-09
  • 打赏
  • 举报
回复
引用 楼主 xiaomahuan 的回复:
当数据足够多的时候,点击上一页、下一页时,数据会出现重复的现象,但是没有什么规律,数据极少时基本很难发现,但数据多时,在最后几页就比较明显,请各位帮忙分析下什么原因导致。。
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()。

3,499

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧