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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM