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

SQL汇总指定行数据报子查询返回多行错误解决方法

错误原因

你的原有SQL存在三处逻辑问题:

  • 重复关联表:同时使用了隐式交叉连接(employee e, works_with ww)和显式INNER JOIN works_with,会产生大量重复笛卡尔积数据
  • 字段赋值逻辑错误:ww.total_sales = (子查询)是布尔判断表达式,返回值是0(不成立)/1(成立),不是将子查询的聚合结果作为Sales字段的值
  • 子查询别名冲突:子查询内外层都用了ww作为works_with的别名,导致关联条件逻辑混乱,子查询返回多行结果触发1242错误
正确写法

按员工统计总销售额的需求不需要写嵌套相关子查询,两种标准写法都可以实现:

写法1:预聚合后关联(逻辑清晰,易维护)

先在子查询里按员工分组计算好总销售额,再和员工表关联,避免重复计算:

SELECT 
  e.emp_id AS ID,
  e.first_name AS 'First Name',
  e.last_name AS 'Last Name',
  ww.total_sales AS Sales
FROM employee e
INNER JOIN (
  SELECT 
    emp_id,
    SUM(total_sales) AS total_sales
  FROM works_with
  GROUP BY emp_id
) ww ON e.emp_id = ww.emp_id;

写法2:直接关联后分组(写法简洁)

两表关联后直接按员工维度分组聚合,代码更短:

SELECT
  e.emp_id AS ID,
  e.first_name AS 'First Name',
  e.last_name AS 'Last Name',
  SUM(ww.total_sales) AS Sales
FROM employee e
INNER JOIN works_with ww 
  ON e.emp_id = ww.emp_id
GROUP BY e.emp_id, e.first_name, e.last_name;

补充说明:如果后续需要统计没有任何销售记录的员工,把INNER JOIN替换为LEFT JOIN,同时将销售额计算逻辑改为IFNULL(SUM(ww.total_sales), 0)即可,无销售记录的员工销售额会显示为0。

以上两种写法执行后都会返回预期结果:

  • 102 Michael Scott:282000
  • 108 Jim Halpert:34500

内容的提问来源于stack exchange,提问作者gabbagoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:51:46