top
Loading...
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語句一樣,在UPDATEDELETE語句中,子查詢是合法的。所以您可以在UPDATE語句中使用子查詢進行賦值。不過,您不能把同一個表(在本例中為表t1)既用于子查詢的FROM子句,又用于更新目標。

對于事務存儲引擎,子查詢的錯誤會導致整個語句失效。對于非事務存儲引擎,在遇到錯誤之前進行的數據修訂會被保留。

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html
北斗有巢氏 有巢氏北斗