美文网首页
常犯错误:Subquery returns more than

常犯错误:Subquery returns more than

作者: 酸甜柠檬26 | 来源:发表于2019-10-26 21:43 被阅读0次

1、用一条SQL语句查询出mianshi1表中每门课都大于80分的学生姓名


image.png
SELECT NAME FROM mianshi1 
WHERE
    ( SELECT min( fenshu ) FROM mianshi1 GROUP BY NAME ) > 80;

报错:Subquery returns more than 1 row,子句返回多个结果,可以将子句改成下面那样非子句的形式,,,同样的错误在下面第2题也有出现。。。
正确写法:

SELECT NAME FROM mianshi1 
GROUP BY NAME HAVING min( fenshu ) > 80;

2、查询Score中选学多门课程的同学中分数为非最高成绩的记录(interviewquestion45-20)


image.png
SELECT * FROM Score 
WHERE
    Degree NOT IN ( SELECT max( Degree ) FROM Score GROUP BY Sno ) 
    AND ( SELECT count( * ) FROM Score GROUP BY Sno ) > 1

报错:Subquery returns more than 1 row,同时逻辑出错,第一个子查询返回的结果是不包含每个同学的最高成绩
第二个子查询select返回的记录有多条,在子句最后加上limit 1,找到任何一个符合条件的就可以执行了,或者在括号前面写any,这里结果是对的,但是它只返回一条limit 1 ,在有的地方可能不对。
正确写法:

SELECT * FROM Score a 
WHERE
    Degree < ( SELECT max( Degree ) FROM Score b WHERE a.Cno = b.Cno ) 
    AND Sno IN ( SELECT Sno FROM Score GROUP BY Sno HAVING count( Sno ) > 1 );
#max(Degree)那个子句是选出每门课程的最高分

3、查询成绩比该课程平均成绩低的同学的成绩表(interviewquestion45-33)
同样是第2题中的那个Score表

SELECT * FROM Score 
WHERE
    Degree < ( SELECT avg( Degree ) FROM Score GROUP BY Cno )

报错:Subquery returns more than 1 row
子查询select返回的结果为多行数据,在子句最后加上limit 1,找到任何一个符合条件的就可以执行了,或者在括号前面写any
正确写法:

SELECT * FROM Score a 
WHERE
    Degree < ( SELECT avg( Degree ) FROM Score b WHERE a.Cno = b.Cno );

这一题的求各个课程的平均分的逻辑和第二题中求各个课程的最高分的逻辑一样,也和第四题中求对应城市的相应money的逻辑一样,是将对应的值对应到对应类目上去,并没有一次返回多个平均值avg
所以,和错误写法相比,那个错误写法的逻辑子查询是一次性返回的多个结果,而不是像正确写法那样将多个avg对应到相应类目上去。

专题《子查询和join查询》中的练习2中的方法一同样是子查询()>3,子查询也会返回大于一个值的结果,为什么不报错?
Answer:那个子查询的逻辑上第三题的正确答案的逻辑是一样的,是用Typename =F.Typename来进行同类型的匹配,将对应的值对应到对应类目上去,并不是一次性返回多个count.

4、第二题中提到的limit 1在别的地方会报错的例子:


image.png

将一维表转化为下图二维表:


image.png
正确:
select year,
(select amount from mianshi5 m where month=1 and m.year=a.year) m1,
(select amount from mianshi5 m where month=2 and m.year=a.year) m2,
(select amount from mianshi5 m where month=3 and m.year=a.year) m3,
(select amount from mianshi5 m where month=4 and m.year=a.year) m4
from mianshi5 a group by year;

错误:

select year,
(select amount from mianshi5 m where month=1 limit 1) m1,
(select amount from mianshi5 m where month=2 limit 1) m2,
(select amount from mianshi5 m where month=3 limit 1) m3,
(select amount from mianshi5 m where month=4 limit 1) m4
from mianshi5 a group by year;

后面的m.year=a.year在这里的作用:将月份对应放在外层表a的相应年份上,去掉会报错Subquery returns more than 1 row,因为month=1对应有两个值,去掉后改成limit 1,会运行,但运行得到的结果出错,结果如下,1992年那一行数据会和第一行一样,因为是limit 1 选出来的第一行,会同步到第二行去。


image.png

相关文章

网友评论

      本文标题:常犯错误:Subquery returns more than

      本文链接:https://www.haomeiwen.com/subject/jzlsvctx.html