子查詢錯誤html
有些錯誤只適用於子查詢。本節將介紹它們。mysql
● 不支持的子查詢語法:sql
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 不支持以下語句:ide
1. SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
● 子查詢中的列數不正確:code
1. ERROR 1241 (ER_OPERAND_COL) 2. SQLSTATE = 21000 3. Message = "Operand should contain 1 column(s)"
在如下狀況下會發生此錯誤:htm
1. SELECT (SELECT column1, column2 FROM t2) FROM t1;
若是目的是行比較,則能夠使用返回多個列的子查詢。在其餘上下文中,子查詢必須是標量操做數。事務
● 子查詢的行數不正確:ci
1. ERROR 1241 (ER_OPERAND_COL) 2. SQLSTATE = 21000 3. Message = "Operand should contain 1 column(s)"
對於子查詢最多隻能返回一行但返回多行的語句,會出現此錯誤。考慮如下示例:get
1. SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
若是 SELECT column1 FROM t2 只返回一行,則上一個查詢能夠工做。若是子查詢返回多行,則會出現錯誤 1242。在這種狀況下,查詢應重寫爲:it
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 時,本節中描述的全部錯誤也適用。
對於事務性存儲引擎,子查詢的失敗會致使整個語句失敗。對於非事務存儲引擎,將保留在遇到錯誤以前所作的數據修改。
官方網址:
https://dev.mysql.com/doc/refman/8.0/en/subquery-errors.html