サブクエリーにのみ適用されるエラーがいくつか存在します。このセクションでは、これらについて説明します。
-
サポートされていないサブクエリー構文:
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.10.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
が 1 行だけを返す場合、前のクエリーは機能します。このサブクエリーが複数の行を返す場合は、エラー 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
ステートメント内の割り当てのためにサブクエリーを使用できます。ただし、サブクエリーのFROM
句と更新のターゲットの両方に同じテーブル (この場合は、テーブルt1
) を使用することはできません。
トランザクションストレージエンジンの場合は、サブクエリーが失敗するとステートメント全体が失敗します。非トランザクションストレージエンジンの場合は、エラーが検出される前に行われたデータ変更が保持されます。