You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:18:18