SQL统计各大洲城市及国家数量的查询写法与错误排查
原写法问题说明
- 你写的
WHERE co.continent = co2.continent确实不合法:UNION前后的两个查询是完全独立的执行单元,各自的作用域隔离,第二个查询无法引用第一个查询里的co表别名。 - 此外UNION要求两个查询返回的列数、对应列的数据类型完全匹配,你第一个查询返回2列,第二个仅返回1列,本身也不符合UNION的语法要求。
正确实现方案
推荐两种常用写法,都可以直接满足需求:
写法1:简洁版(适合小数据量场景)
直接关联两张表后用COUNT(DISTINCT)统计不重复的国家数量即可:
SELECT co.continent 大洲名称, COUNT(c.id) 对应城市总数量, COUNT(DISTINCT co.code) 对应国家总数量 FROM Country co LEFT JOIN City c ON c.countrycode = co.code GROUP BY co.continent;
注意用
LEFT JOIN而不是INNER JOIN,避免过滤掉没有对应城市的大洲,导致统计遗漏。
写法2:高性能版(适合大数据量场景)
先单独统计每个国家的城市数,再按大洲聚合,避免关联后产生大量重复行影响统计效率:
-- 先统计每个国家的城市总数 WITH country_city_stat AS ( SELECT countrycode, COUNT(*) city_cnt FROM City GROUP BY countrycode ) -- 按大洲聚合最终结果 SELECT co.continent 大洲名称, COUNT(co.code) 对应国家总数量, COALESCE(SUM(cs.city_cnt), 0) 对应城市总数量 FROM Country co LEFT JOIN country_city_stat cs ON co.code = cs.countrycode GROUP BY co.continent;
内容的提问来源于stack exchange,提问作者Skel
相关产品推荐
相关产品推荐

