MySQL的SQL語句 - 資料操作語句(13)- 子查詢(11)
阿新 • • 發佈:2020-12-04
子查詢錯誤
有些錯誤只適用於子查詢。本節將介紹它們。
● 不支援的子查詢語法:
1. ERROR 1235 (ER_NOT_SUPPORTED_YET)
2. SQLSTATE = 42000
3. Message = "This version of MySQL doesn't yet support
4. 'LIMIT & IN/ALL/ANY/SOME subquery'"
這意味著 MySQL 不支援如下語句:
1. SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
● 子查詢中的列數不正確:
1. ERROR 1241 (ER_OPERAND_COL) 2. SQLSTATE = 21000 3. Message = "Operand should contain 1 column(s)"
在以下情況下會發生此錯誤:
1. SELECT (SELECT column1, column2 FROM t2) FROM t1;
如果目的是行比較,則可以使用返回多個列的子查詢。在其他上下文中,子查詢必須是標量運算元。
● 子查詢的行數不正確:
1. ERROR 1241 (ER_OPERAND_COL)
2. SQLSTATE = 21000
3. Message = "Operand should contain 1 column(s)"
對於子查詢最多隻能返回一行但返回多行的語句,會出現此錯誤。考慮以下示例:
1. SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
如果 SELECT column1 FROM t2 只返回一行,則上一個查詢可以工作。如果子查詢返回多行,則會出現錯誤 1242。在這種情況下,查詢應重寫為:
1. SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
● 子查詢中的表使用錯誤:
1. Error 1093 (ER_UPDATE_TABLE_USED)
2. SQLSTATE = HY000
3. Message = "You can't specify target table 'x'
4. for update in FROM clause"
在以下情況下會發生此錯誤,即試圖修改表並從子查詢中對同一表中進行查詢:
1. UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);
可以使用公共表表達式或派生表來解決此問題。
在 MySQL 8.0.19 及更高版本中,當在子查詢中使用 TABLE 時,本節中描述的所有錯誤也適用。
對於事務性儲存引擎,子查詢的失敗會導致整個語句失敗。對於非事務儲存引擎,將保留在遇到錯誤之前所做的資料修改。
官方網址: