- 問題: 查詢當"課程" 等於子查詢里面的課程信息
- 出錯指令: [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"作用相同