[Err] 1242 - Subquery returns more than 1 row及处理办法
- 问题: 查询当"课程" 等于子查询里面的课程信息
- 出错指令: [Err] 1242 - Subquery returns more than 1 row
开始出错时的SQL
-- 省略部分
CASE WHEN kcmc = (SELECT kcmc FROM t_sdrs_xscj WHERE xh in (2013210254)
AND KCMC NOT IN(SELECT kk.kcmc FROM ( SELECT kcmc,max(CJ) mcj
FROM t_sdrs_xscj WHERE xh in (2013210254)
GROUP BY kcmc
HAVING COUNT(kcmc)=2
)kk
-- 省略部分
查看了好多原因,终于在一个博主中找到我想要的答案(https://www.cnblogs.com/dmcs95/p/10777013.html)。
- 报错信息:
ERROR 1242 (21000): Subquery returns more than 1 row
- 报错信息翻译:
子查询返回超过1行
- 分析与解决方法:
1. 在重复写入时会出现这种问题, 可通过去掉重复数据解决
- 通过在写入时加逻辑判断或者外键防止数据重复写入
2. 利用IN、SOME、ANY、ALL关键字进行限制
- 报错信息出自子查询, 因此需要对子查询涉及指令进行条件修改
最终解决后的SQL
-- 省略部分 CASE WHEN kcmc IN (SELECT kcmc FROM t_sdrs_xscj WHERE xh in (2013210254) AND KCMC NOT IN(SELECT kk.kcmc FROM ( SELECT kcmc,max(CJ) mcj FROM t_sdrs_xscj WHERE xh in (2013210254) GROUP BY kcmc HAVING COUNT(kcmc)=2 )kk -- 省略部分
/*
其实就是将"="号 改为"IN"。
原因是"="号的后面取的可以使具体的值也可以是空值,不是判断关键词,
但是"IN"是会与后面的数据值进行判断的,可以作为判断关键词。
*/
可理解为:
子查询就是指在一个SELECT语句中嵌套另一个SELECT语句
IN、SOME、ANY、ALL都是子查询涉及的关键词
- ANY可与= (>, >=, <, <=, <>)结合使用,分别表示等于(大于, 大于等于, 小于, 小于等于, 不等于)其中的任何一个数据
-- ANY关键字必须与一个比较操作符一起使用
-- ANY关键词可以理解为"对于子查询返回的列中的任一数值, 如果比较结果为True, 则返回True"
- ALL可与= (>, >=, <, <=, <>)结合使用,分别表示等于(大于, 大于等于, 小于, 小于等于, 不等于)其中的所有数据
-- ALL关键字必须与一个比较操作符一起使用
-- ALL关键词可以理解为"对于子查询返回的列中的所有值, 如果比较结果为True, 则返回True"
- 关键词IN 与关键词组合"=ANY"作用相同