SQL JOIN统计关联数量含0值时遗漏丹麦记录的问题与解决
问题原因
- 你的SQL语句违反了SQL标准的
GROUP BY一致性规则:你在SELECT子句中使用了非聚合字段country.name,但GROUP BY子句仅指定了human.homeland字段。只有当数据库开启了非严格的SQL模式(比如低版本MariaDB默认关闭ONLY_FULL_GROUP_BY的情况)才会允许这种语法执行,但执行结果不具备确定性。 - 对于没有对应人口记录的国家,
human.homeland字段的值为NULL,所有homeland为NULL的行都会被合并为同一组:你看到的挪威0人口的结果,实际是挪威和丹麦两个国家的行被合并后,数据库随机取了其中一个国家的名称返回,因此丹麦的记录被覆盖消失。
通用解决方案(兼容所有标准SQL数据库)
将GROUP BY的字段替换为country表的唯一标识字段,确保分组逻辑按国家维度拆分,不会合并无人口的国家,符合所有主流数据库的语法要求:
SELECT country.name, COUNT(human.name) AS population FROM human RIGHT JOIN country ON human.homeland = country.id GROUP BY country.id, country.name;
如果你的数据库支持仅按主键分组(主键可唯一确定行的场景,比如PostgreSQL、MySQL 8.0+、高版本MariaDB),也可以简化为:
SELECT country.name, COUNT(human.name) AS population FROM human RIGHT JOIN country ON human.homeland = country.id GROUP BY country.id;
执行后即可得到包含丹麦的正确统计结果:
+---------+------------+ | name | population | +---------+------------+ | Finland | 2 | | Sweden | 1 | | Norway | 0 | | Denmark | 0 | +---------+------------+
内容的提问来源于stack exchange,提问作者Jori Mäntysalo
相关产品推荐
相关产品推荐

