SQL查询报错:子查询返回多行,求以1990年为基准计算各国CO2排放占比方法
解决CO2排放占比计算的SQL子查询错误问题
你遇到的“Subquery returns more than 1 row”错误,核心原因是子查询没有和主表的国家字段关联——它直接返回了所有国家1990年的排放量(多行数据),但主表的每一行只需要对应国家的1990年基准值,所以触发了报错。
下面给你两种简单易懂的解决方法,假设你的数据表名为co2_emissions,字段包含country(国家名称)、year(年份)、emissions(CO2排放量):
方法一:关联子查询
通过给主表和子查询加别名,让子查询只返回当前行对应国家的1990年数据:
SELECT country, year, emissions, -- 子查询通过country字段和主表关联,确保只返回当前国家的1990年数据 emissions / (SELECT emissions FROM co2_emissions sub WHERE sub.country = main.country AND sub.year = 1990) AS emission_ratio FROM co2_emissions main ORDER BY country, year;
方法二:自连接(JOIN)
把数据表和自己做连接,单独提取1990年的数据作为基准表,再和所有年份的数据匹配:
SELECT main.country, main.year, main.emissions, -- 用主表排放量除以对应国家的1990年基准值 main.emissions / base.emissions AS emission_ratio FROM co2_emissions main -- 关联到1990年的基准数据,匹配同一个国家 JOIN co2_emissions base ON main.country = base.country AND base.year = 1990 ORDER BY main.country, main.year;
额外提示
- 如果想把比例转成百分比,可以乘以100并保留小数,比如
ROUND((emissions / base.emissions)*100, 2) AS emission_percentage; - 如果存在某个国家1990年排放量为0的情况,用
NULLIF避免除以0报错:emissions / NULLIF(base.emissions, 0); - 如果有的国家没有1990年数据,关联子查询会返回
NULL,自连接则会直接排除这些国家的所有行,你可以根据需求选择。
内容的提问来源于stack exchange,提问作者Muhammad Adan riaz
相关产品推荐
相关产品推荐

