[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"作用相同

posted @ 2020-08-11 14:37  Yuezc  Views(10902)  Comments(0Edit  收藏  举报