サブクエリーにのみ適用されるエラーがいくつか存在します。 このセクションでは、これらについて説明します。
-
サポートされていないサブクエリー構文:
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
を使用する場合にも適用されます。
トランザクションストレージエンジンの場合は、サブクエリーが失敗するとステートメント全体が失敗します。 非トランザクションストレージエンジンの場合は、エラーが検出される前に行われたデータ変更が保持されます。