多对多表关联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.
相关产品推荐
相关产品推荐

