13.2.8.9.子查詢錯誤
13.2.8.9. 子查詢錯誤
以下錯誤只適用于子查詢。本節把這些錯誤歸在一起。
· 來自子查詢的列的數目不正確
· ERROR 1241 (ER_OPERAND_COL)
· SQLSTATE = 21000
· Message = "Operand should contain 1 column(s)"
在出現以下情況時,發生此錯誤:
SELECT (SELECT column1, column2 FROM t2) FROM t1;
如果您的目的是進行比較,您可以使用能返回多個列的子查詢。請參見13.2.8.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);
和SELECT語句一樣,在UPDATE和DELETE語句中,子查詢是合法的。所以您可以在UPDATE語句中使用子查詢進行賦值。不過,您不能把同一個表(在本例中為表t1)既用于子查詢的FROM子句,又用于更新目標。
對于事務存儲引擎,子查詢的錯誤會導致整個語句失效。對于非事務存儲引擎,在遇到錯誤之前進行的數據修訂會被保留。