Spec-Zone.ru › MySQL 5.7

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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/subquery-errors.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API