• [Err] 1242


    - 问题: 查询当"课程" 等于子查询里面的课程信息

     - 出错指令: [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"作用相同

  • 相关阅读:
    C++11 学习总结
    平衡二叉树 (AVL) 笔记
    拼图模板
    2013.9.12
    2013.9.11
    2013.9.10
    2013.9.9
    下载网站
    ubuntu 安装codeblocks
    12个球称3次找坏球的完美解答
  • 原文地址:https://www.cnblogs.com/yuezc/p/13475472.html
Copyright © 2020-2023  润新知