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
相关产品推荐
相关产品推荐

