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

多对多表关联SQL查询 去重避免重复计数正确计算Value1平均值

问题根源

原查询直接通过JOIN关联多对多表,当同一个事件存在多条符合筛选条件的关联记录时,主表Events的对应行会被重复返回,最终参与平均值计算的行数等于匹配到的关联记录总条数,导致计算结果偏小。
本次场景中:

  • 符合筛选条件的事件实际为ID=2(Value1=0)、ID=3(Value1=1)共2条,正确平均值为(0+1)/2=0.5
  • 原查询关联后会返回3行记录(ID=2匹配2条关联值、ID=3匹配1条关联值),计算得到(0+0+1)/3≈0.333也就是1/3,和预期结果不符。
修正方案

两种可去重的正确写法,最终结果均符合预期:

写法1:使用EXISTS判断关联关系(优先推荐)

EXISTS子查询只要检测到任意一条符合条件的关联记录就会判定事件匹配,不会产生主表重复行,大表场景下执行效率更高。

SELECT AVG(e.Value1)
FROM Events e
WHERE e.Value2 IN (1,3) -- 替换为你的Values2List参数
  AND EXISTS (
      SELECT 1
      FROM ManyToMany m
      WHERE m.EventID = e.ID
        AND m.Values3 IN (0,2,3,4,7,8) -- 替换为你的Values3List参数
  )

写法2:关联去重后的关联表子查询

如果习惯使用JOIN写法,可以先在子查询中对关联表做筛选+去重,只保留符合条件的不重复EventID,再关联主表计算:

SELECT AVG(e.Value1)
FROM Events e
JOIN (
    SELECT DISTINCT EventID
    FROM ManyToMany
    WHERE Values3 IN (0,2,3,4,7,8) -- 替换为你的Values3List参数
) m ON e.ID = m.EventID
WHERE e.Value2 IN (1,3) -- 替换为你的Values2List参数

内容的提问来源于stack exchange,提问作者J.N.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:48:19