双表JOIN运行正常但三表JOIN出现重复,如何预聚合pmmm表解决?
多表JOIN重复问题解决方案
核心原因
多表JOIN出现数据重复的根源是pmmm表的(ITEM, DEST)组合不唯一,关联第三张表时,同组的多行pmmm记录会和第三张表的匹配行生成笛卡尔积,导致行数翻倍、求和结果异常。你需要先对pmmm表按关联键预聚合,保证每个(ITEM, DEST)组合仅返回一行记录后再参与JOIN。
注意:你当前的两表JOIN SQL存在逻辑缺陷:
GROUP BY中包含了p.qty,会导致相同ITEM、不同QTY的行被拆分为多个分组,SUM(QTY)结果无法匹配单ITEM总数量的预期,需要同步调整。
预聚合实现代码
方法1:子查询预聚合
SELECT S.ITEM, SUM(P.agg_qty) AS total_qty FROM smm S JOIN ( -- 按关联键预聚合pmmm,确保每组(ITEM, DEST)只有一行 SELECT ITEM, DEST, SUM(QTY) AS agg_qty FROM pmmm GROUP BY ITEM, DEST ) P ON S.ITEM = P.ITEM AND P.DEST = S.LOC -- 此处可直接添加第三张表的JOIN逻辑,不会触发重复 -- JOIN third_table T ON 关联条件 GROUP BY S.ITEM
方法2:CTE方式预聚合(可读性更强)
WITH pmmm_agg AS ( SELECT ITEM, DEST, SUM(QTY) AS agg_qty FROM pmmm GROUP BY ITEM, DEST ) SELECT S.ITEM, SUM(P.agg_qty) AS total_qty FROM smm S JOIN pmmm_agg P ON S.ITEM = P.ITEM AND P.DEST = S.LOC -- 直接关联第三张表即可 -- JOIN third_table T ON 关联条件 GROUP BY S.ITEM
补充说明
如果业务需要用到pmmm表中QTY之外的其他字段,预聚合时可根据需求调整聚合逻辑,比如用MAX()、MIN()、GROUP_CONCAT()等函数处理对应字段,只要保证每个(ITEM, DEST)组仅返回一行即可。
内容的提问来源于stack exchange,提问作者JeremyU
相关产品推荐
相关产品推荐

