MySQL的SQL語句 - 數據操做語句(13)- 子查詢(11)

子查詢錯誤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

相關文章
相關標籤/搜索