下面是返回子查询的MySQL代码。我希望子查询只返回一行。
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行
发布于 2019-03-03 06:39:15
首先,字面答案是:如果用作表达式的子查询返回多行,则修改它,使其最多返回一行。
我要胡思乱想,说你想找那些收入低于平均工资的人。解决办法是:
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子句中的数据来筛选子查询。例如,如果您希望返回收入低于自己平均薪资的每个实例:
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子句中-它返回与该特定名称匹配的所有薪资行的平均值,而不是按名称分组的所有薪资行的平均值。前者是一个值(对于一个特定的人),后者是每个人的一个值(因此是一个错误)。
https://stackoverflow.com/questions/54965977
复制相似问题