これらはサブクエリーにだけ適応するエラーです。この節では、それらについて説明していきます。
サポートされていないサブクエリー構文
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;
もし比較することが目的であれば、複合カラムを帰すサブクエリーを利用すると良いでしょう。ほかのコンテキストでは、サブクエリーはスカラーオペランドである必要があります。項8.2.9.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
節と更新ターゲットの両方に対して利用することはできません。
トランザクションストレージエンジンに対しては、サブクエリーの失敗は、ステートメント全体の失敗を引き起こします。非トランザクションストレージエンジンの場合、エラーが検出される前に行われたデータ変更は保持されます。