MySQL 8.0 リファレンスマニュアル


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「行サブクエリー」を参照してください。

  • サブクエリーからの正しくない行数:

    ERROR 1242 (ER_SUBSELECT_NO_1_ROW)
    SQLSTATE = 21000
    Message = "Subquery returns more than 1 row"

    このエラーは、サブクエリーが最大で 1 行しか返す必要がないにもかかわらず、複数の行を返すステートメントで発生します。 次の例を考えてみます。

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

    これを回避するには、共通テーブル式または導出テーブルを使用できます。 セクション13.2.11.12「サブクエリーの制約」を参照してください。

MySQL 8.0.19 以降では、このセクションで説明するすべてのエラーは、サブクエリーで TABLE を使用する場合にも適用されます。

トランザクションストレージエンジンの場合は、サブクエリーが失敗するとステートメント全体が失敗します。 非トランザクションストレージエンジンの場合は、エラーが検出される前に行われたデータ変更が保持されます。


関連キーワード:  ステートメント, CREATE, サブクエリー, TABLE, DROP, FROM, FUNCTION, エラー, SLAVE, column