これらはサブクエリにだけ適応するエラーです。このセクションでは、それらについて説明していきます。
サポートされていないサブクエリ構文
ERROR 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message = "This version of MySQL does not yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"
これは、次の形のステートメントはまだ機能しないと言う意味です。
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;
もし比較する事が目的であれば、複合カラムを帰すサブクエリを利用すると良いでしょう。詳しくは 項12.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
が行を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
ステートメント内で、割り当ての為にサブクエリを利用する事ができます。しかし、同じテーブルを(この場合、テーブル
t1
)サブクエリの
FROM
条項と更新ターゲットの両方に対して利用する事はできません。
トランザクション ストレージ エンジンに対しては、サブクエリの失敗は、ステートメント全体の失敗を引き起こします。非トランザクション ストレージ エンジンに対しては、エラーが起こる前に行われたデータ修正が保持されます。