Oracle多表联查分页数据重复出现

一、问题描述


使用Oracle的分页语句进行分页,第一页,没问题,第二页出现重复数据:


第一页的数据:

SELECT *
FROM (
	SELECT u.*, rownum AS r
	FROM (
		SELECT configs.VIDEOSERVICE, configs.VOICESERVICE, configs.IMAGESERVICE, doc.id AS docid, doc.name AS docname
			, doc.begood, rice.graphicprice, rice.speechprice, rice.videoprice, chart.titleName
			, hpath.FTPURL || doc.PHOTOID AS ftpurl, luate.score
		FROM HEALTHDOCTOR doc
		LEFT JOIN HealthServiceConfig configs ON doc.id = configs.docid 
		LEFT JOIN HEALTHPRICE rice ON doc.id = rice.docid 
		LEFT JOIN healthTitleChart chart ON doc.titlecode = chart.TITLECODE 
		LEFT JOIN HEALTHFTPPATH hpath ON doc.PATHCODE = hpath.PATHCODE 
		LEFT JOIN (
			SELECT round(AVG(score), 1) AS score, docid
			FROM healthevaluate
			GROUP BY docid
		) luate ON doc.id = luate.docid 
			LEFT JOIN (
				SELECT COUNT(*) AS ordersum, docid
				FROM HealthyOrder
				GROUP BY docid
			) orders ON doc.id = orders.docid 
		WHERE rice.GRAPHICPRICE >= 0
	) u
	WHERE rownum < 13
)
WHERE r >= 1



第二页的数据:

SELECT *
FROM (
	SELECT u.*, rownum AS r
	FROM (
		SELECT configs.VIDEOSERVICE, configs.VOICESERVICE, configs.IMAGESERVICE, doc.id AS docid, doc.name AS docname
			, doc.begood, rice.graphicprice, rice.speechprice, rice.videoprice, chart.titleName
			, hpath.FTPURL || doc.PHOTOID AS ftpurl, luate.score
		FROM HEALTHDOCTOR doc
		LEFT JOIN HealthServiceConfig configs ON doc.id = configs.docid 
		LEFT JOIN HEALTHPRICE rice ON doc.id = rice.docid 
		LEFT JOIN healthTitleChart chart ON doc.titlecode = chart.TITLECODE 
		LEFT JOIN HEALTHFTPPATH hpath ON doc.PATHCODE = hpath.PATHCODE 
		LEFT JOIN (
			SELECT round(AVG(score), 1) AS score, docid
			FROM healthevaluate
			GROUP BY docid
		) luate ON doc.id = luate.docid 
			LEFT JOIN (
				SELECT COUNT(*) AS ordersum, docid
				FROM HealthyOrder
				GROUP BY docid
			) orders ON doc.id = orders.docid 
		WHERE rice.GRAPHICPRICE >= 0 
	) u
	WHERE rownum < 25
)
WHERE r >= 13



第一页和第二页有数据重复了,排序有问题。


二、解决方法


在最外层加个"order by id"其中这个id是主键就行了:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值