Spec-Zone .ru
спецификации, руководства, описания, API
|
Есть некоторые ошибки, которые применяются только к подзапросам. Этот раздел описывает их.
Неподдерживаемый синтаксис подзапроса:
ERROR 1235 (ER_NOT_SUPPORTED_YET)SQLSTATE = 42000Message = "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 = 21000Message = "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 = 21000Message = "Subquery returns more than 1 row"
Эта ошибка происходит для операторов, куда подзапрос должен возвратить самое большее одну строку, но возвращает многократные строки. Рассмотрите следующий пример:
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 = HY000Message = "You can't specify target table 'x'for update in FROM clause"
Эта ошибка происходит в случаях такой как следующий, который пытается изменить таблицу и избранный от той же самой таблицы в подзапросе:
UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);
Можно использовать подзапрос для присвоения в пределах UPDATE
оператор, потому что подзапросы являются законными в UPDATE
и DELETE
операторы так же как в SELECT
операторы. Однако, невозможно использовать ту же самую таблицу (в этом случае, таблица t1
) для обоих подзапрос FROM
пункт и
цель обновления.
Для транзакционных механизмов хранения отказ подзапроса заставляет весь оператор перестать работать. Для нетранзакционных механизмов хранения модификации данных, сделанные прежде, чем встретились с ошибкой, сохраняются.