You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双表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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:24:01