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

SQL多表关联查询:表B存在匹配记录时求表A字段平均值结果异常

问题原因分析

你当前SQL返回结果不符合预期的核心原因是INNER JOIN会产生重复行:
表A中pk=A的记录在表B满足v=5的匹配行有6条,JOIN后w=100这个值会被重复计算6次;表A中pk=B的记录在表B满足v=5的匹配行有1条,JOIN后w=0这个值会被计算1次。最终AVG计算的是(6*100 + 1*0)/7 = 600/7 ≈85.714,和你拿到的实际结果一致,不符合你「每个符合条件的A表记录只计算1次」的需求。

正确实现方案

方案1:使用EXISTS子查询(推荐)

该方案逻辑完全贴合「存在至少1条匹配记录」的需求,不会产生重复行,性能也最优:

SELECT AVG(A.w)
FROM A
WHERE EXISTS (
    SELECT 1 FROM B 
    WHERE B.fk = A.pk AND B.v = 5
);

执行后计算逻辑为(100+0)/2=50,完全符合你的预期。

方案2:先对B表匹配项去重后再JOIN

如果更习惯用JOIN写法,可以先对B表符合条件的外键去重后再关联:

SELECT AVG(A.w)
FROM A
INNER JOIN (
    SELECT DISTINCT fk FROM B WHERE v = 5
) AS valid_b ON A.pk = valid_b.fk

最终结果和方案1完全一致。


内容的提问来源于stack exchange,提问作者Julien Lafleur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 00:24:02