首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:#1242 - Subquery返回查询中的多于1行- MYSQL

问错误:#1242 - Subquery返回查询中的多于1行- MYSQL
EN

Stack Overflow用户
提问于 2019-03-03 05:50:19
回答 1查看 688关注 0票数 1

下面是返回子查询的MySQL代码。我希望子查询只返回一行。

代码语言:javascript
复制
SELECT DISTINCT w.cname
    FROM works w 
    WHERE 
    (SELECT DISTINCT w.cname, AVG(w.salary)
    FROM works w
    WHERE 1
    GROUP BY w.cname
    )

<

(SELECT DISTINCT w.cname,AVG(w.salary)
FROM works w
WHERE 1
 GROUP BY w.cname
)

MySQL错误说:

1242 -子查询返回多于1行

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-03 06:39:15

首先,字面答案是:如果用作表达式的子查询返回多行,则修改它,使其最多返回一行。

我要胡思乱想,说你想找那些收入低于平均工资的人。解决办法是:

代码语言:javascript
复制
SELECT -- add DISTINCT if needed
  w.cname
FROM
  works w
WHERE
  w.salary < (SELECT AVG(w2.salary) FROM works w2)

注意,这里的子查询(SELECT AVG(w2.salary) FROM works w2)总是返回一个值,因为没有GROUP BY子句。(而且,由于works表的这个实例与另一个没有任何关系,因为您从中得到了完全无关的东西,所以使用不同的表别名--因此是w2--是很好的做法(某些DBMS或其他数据库管理系统需要这样做)。

注意,由于可以在子查询中引用原始表,所以可以使用外部查询的FROM子句中的数据来筛选子查询。例如,如果您希望返回收入低于自己平均薪资的每个实例:

代码语言:javascript
复制
SELECT DISTINCT
  w.cname, w.salary
FROM
  works w
WHERE
  w.salary < (SELECT AVG(w2.salary) FROM works w2 WHERE w2.cname = w.cname)

注意不同的表别名(w和w2)在这里有多重要。此外,该子查询仍然只返回一行,因为筛选器名称位于WHERE子句中-它返回与该特定名称匹配的所有薪资行的平均值,而不是按名称分组的所有薪资行的平均值。前者是一个值(对于一个特定的人),后者是每个人的一个值(因此是一个错误)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54965977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档