13.2.10.9 Ошибки подзапросов
Существуют некоторые ошибки, которые применяются только к подзапросам. В этом разделе они описаны.
-
Неподдерживаемый синтаксис подзапроса:
ERROR 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message = "This version of MySQL does not 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"
Эта ошибка возникает для операторов, где подзапрос должен вернуть не более одной строки, но возвращает несколько строк. Рассмотрим следующий пример:
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 = HY000 Message = "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, так и для целевого объекта обновления.
Для транзакционных движков хранилищ ошибка подзапроса приводит к ошибке всего оператора. Для не транзакционных движков хранилищ изменения данных, внесенные до появления ошибки, сохраняются.
© 2025 Oracle
Licensed under the GPLv2 License.