#### 13.2.11.10 子查询错误

[](<>)[](<>)

有些错误仅适用于子查询。本节介绍它们。

-   不支持的子查询语法：

    ```
    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;
    ```

    如果目的是行比较，您可以使用返回多列的子查询。在其他情况下，子查询必须是标量操作数。看[第 13.2.11.5 节，“行子查询”](row-subqueries.html).

-   子查询的行数不正确：

    ```
    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);
    ```

    如果`从 t2 中选择 column1`只返回一行，前一个查询有效。如果子查询返回多于一行，则会出现错误 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);
    ```

    您可以使用公用表表达式或派生表来解决此问题。看[第 13.2.11.12 节，“对子查询的限制”](subquery-restrictions.html).

    在 MySQL 8.0.19 及更高版本中，本节中描述的所有错误在使用时也适用[`桌子`](table.html)在子查询中。

    对于事务性存储引擎，子查询的失败会导致整个语句失败。对于非事务性存储引擎，在遇到错误之前所做的数据修改会被保留。
