3张MySQL表关联聚合查询未得到预期结果问题求助
问题原因
你写的SQL统计结果不符合预期,核心是多表左连后产生了笛卡尔积重复行:要是同一个Code在TableA或者TableC里有多条匹配记录,会把TableB对应的行重复复制多份,最后算出来的SUM(TableB.Mass)会比真实值大,count计数也会重复统计相同的Code。
修复方案
可以直接在计数的时候加DISTINCT去重,避免重复统计,改后的SQL如下:
SELECT COUNT(DISTINCT TableA.Code) AS a_code_count, SUM(TableB.Mass) AS total_mass, COUNT(DISTINCT TableC.Code) AS c_code_count FROM TableB LEFT JOIN TableA ON TableA.Code = TableB.Code LEFT JOIN TableC ON TableA.Code = TableC.Code GROUP BY TableB.Grade
如果你的数据量比较大,推荐用预聚合去重的写法,执行效率更高:
SELECT COUNT(a.Code) AS a_code_count, SUM(b.Mass) AS total_mass, COUNT(c.Code) AS c_code_count FROM TableB b LEFT JOIN (SELECT DISTINCT Code FROM TableA) a ON b.Code = a.Code LEFT JOIN (SELECT DISTINCT Code FROM TableC) c ON b.Code = c.Code GROUP BY b.Grade
内容的提问来源于stack exchange,提问作者Herbert
相关产品推荐
相关产品推荐

