INNER JOIN结合COUNT与GROUP BY的SQL查询结果异常求助
修正SQL查询以正确统计两个表的行数
你的问题出在直接对连接后的表进行计数——内连接会将FTR和quantity中匹配Line的行进行关联,产生笛卡尔积效应,导致COUNT统计的是连接后的总行数,而非原表各自的行数。
要正确获取每个Line在两个表中的独立行数,需要先分别统计每个表的Line数量,再将结果关联:
方法1:使用子查询关联
SELECT COALESCE(f.Line, q.Line) AS Line, f.FTR_count, q.quantity_count FROM (SELECT Line, COUNT(*) AS FTR_count FROM [work_permit].[dbo].[FTR] GROUP BY Line) f FULL JOIN (SELECT line, COUNT(*) AS quantity_count FROM [work_permit].[dbo].[quantity] GROUP BY line) q ON f.Line = q.line;
方法2:使用CTE(公共表表达式)
WITH FTR_Stats AS ( SELECT Line, COUNT(*) AS FTR_count FROM [work_permit].[dbo].[FTR] GROUP BY Line ), Quantity_Stats AS ( SELECT line, COUNT(*) AS quantity_count FROM [work_permit].[dbo].[quantity] GROUP BY line ) SELECT COALESCE(f.Line, q.line) AS Line, f.FTR_count, q.quantity_count FROM FTR_Stats f FULL JOIN Quantity_Stats q ON f.Line = q.line;
说明
- 使用
FULL JOIN可以确保即使某个Line只存在于其中一个表,也能被统计出来(如果只需要两个表都存在的Line,可以换成INNER JOIN)。 COALESCE用来统一显示Line字段的值,避免其中一方为NULL时显示空缺。- 先单独统计每个表的行数再关联,能避免连接带来的行数放大问题,得到准确的计数结果。
内容的提问来源于stack exchange,提问作者Ram
相关产品推荐
相关产品推荐

