使用COUNT(1)统计子查询记录数结果不符预期的技术咨询
问题分析与解决方案
你的原查询核心问题是混淆了“统计行数”和“求和数值”:
- 子查询通过
UNION ALL返回了两条记录:分别是tbl1的2和tbl2的3,外层的COUNT(1)是在统计这两条记录的行数,结果自然是2,并非你误以为的“最后一个子查询的统计值”。 - 后续的
HAVING COUNT(*)=5是判断子查询返回的行数是否等于5,这显然不成立,所以没有返回结果。
要实现“验证两个表的总记录数之和是否等于5”的需求,有两种简洁的解决方法:
方法一:对子查询结果求和后判断
SELECT SUM(total_records) AS total FROM ( SELECT COUNT(*) AS total_records FROM tbl1 WHERE version_key = '100047' UNION ALL SELECT COUNT(*) AS total_records FROM tbl2 WHERE version_key = '100047' ) AS sub_query HAVING SUM(total_records) = 5;
逻辑:子查询分别统计两个表的记录数,外层用SUM()将两个数值相加,再通过HAVING判断总和是否等于5。符合条件时会返回总和5,否则无结果。
方法二:直接计算两个统计值的和(更高效)
SELECT ( SELECT COUNT(*) FROM tbl1 WHERE version_key = '100047' ) + ( SELECT COUNT(*) FROM tbl2 WHERE version_key = '100047' ) AS total HAVING total = 5;
逻辑:直接将两个表的统计结果相加,一步得到总和,再用HAVING验证是否等于5,省去了子查询的外层遍历,执行效率更高。
内容的提问来源于stack exchange,提问作者user2102665
相关产品推荐
相关产品推荐

