サブクエリだけに適用される新しい戻りエラーがいくつかあります。 このセクションでは、それらのエラーを一つにまとめ、重要な点についていくつか説明します。
ERROR 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message = "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"
これは、次のステートメントが機能しないことを意味する。
SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
ただし、これは、一部の初期のバージョン(MySQL 4.1.1 など)にのみ適用される。
ERROR 1240 (ER_CARDINALITY_COL) SQLSTATE = 21000 Message = "Operand should contain 1 column(s)"
このエラーは次のような場合に発生する。
SELECT (SELECT column1, column2 FROM t2) FROM t1;
比較を目的とするものならば、複数のカラムを返すサブクエリを使用できる。 See 項6.4.2.7. 「行副問い合わせ」。 しかし、他のコンテキストでは、サブクエリはスカラオペランドでなければならない。
ERROR 1241 (ER_SUBSELECT_NO_1_ROW) SQLSTATE = 21000 Message = "Subquery returns more than 1 row"
このエラーは次のような場合に発生する。
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
ただし、これは t2
に複数のレコードが存在する場合に限られる。たとえば、このエラーは長い間使用されているコードで発生することがある。つまり、サブクエリで返すことができるレコード数に影響するような変更を誰かが行ったような場合である。1
つに限らず任意の数のレコードをオブジェクトで検出するようにするときの正しいステートメントは、次のようになる。
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
)を使用することはできません。
通常、サブクエリがエラーになると、ステートメント全体がエラーになります。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.