MySQL 8.4 發行說明
有些錯誤僅適用於子查詢。本節將描述這些錯誤。
不支援的子查詢語法
ERROR 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message = "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"
這表示 MySQL 不支援像以下這樣的語句
SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
子查詢傳回的欄位數量不正確
ERROR 1241 (ER_OPERAND_COL) SQLSTATE = 21000 Message = "Operand should contain 1 column(s)"
當出現如下情況時會發生此錯誤
SELECT (SELECT column1, column2 FROM t2) FROM t1;
如果目的是進行資料列比較,您可以使用傳回多個欄位的子查詢。在其他情況下,子查詢必須是純量運算元。請參閱章節 15.2.15.5,“資料列子查詢”。
子查詢傳回的資料列數量不正確
ERROR 1242 (ER_SUBSELECT_NO_1_ROW) SQLSTATE = 21000 Message = "Subquery returns more than 1 row"
當子查詢必須最多傳回一列,但實際上傳回多列時,會發生此錯誤。請考慮以下範例
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
如果
SELECT column1 FROM t2
只傳回一列,則先前的查詢可以正常運作。如果子查詢傳回多於一列,則會發生錯誤 1242。在這種情況下,查詢應重寫為SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
在子查詢中不正確地使用資料表
Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Message = "You can't specify target table 'x' for update in FROM clause"
在以下情況下會發生此錯誤,例如嘗試修改資料表並在子查詢中從同一個資料表中選取
UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);
您可以使用通用資料表運算式或衍生資料表來解決此問題。請參閱章節 15.2.15.12,“子查詢的限制”。
當在子查詢中使用 TABLE
時,本節中描述的所有錯誤也適用。
對於交易儲存引擎,子查詢的失敗會導致整個語句失敗。對於非交易儲存引擎,在發生錯誤之前所做的資料修改會被保留。