Spec-Zone.ru › MySQL 8.4

15.2.15.10 Ошибки подзапросов

Существуют некоторые ошибки, которые применяются только к подзапросам. В этом разделе они описаны.

  • Неподдерживаемый синтаксис подзапроса:

    ERROR 1235 (ER_NOT_SUPPORTED_YET)
    SQLSTATE = 42000
    Message = "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 = 21000
    Message = "Operand should contain 1 column(s)"
    

    Эта ошибка возникает в таких случаях:

    SELECT (SELECT column1, column2 FROM t2) FROM t1;
    

    Можно использовать подзапрос, возвращающий несколько столбцов, если целью является сравнение строк. В других контекстах подзапрос должен быть скалярным операндом. См. Раздел 15.2.15.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);
    

    Для решения этой проблемы можно использовать общие табличные выражения или производные таблицы. См. Раздел 15.2.15.12, «Ограничения для подзапросов».

Все ошибки, описанные в этом разделе, также применяются при использовании TABLE в подзапросах.

Для транзакционных хранилищ данных ошибка подзапроса приводит к ошибке всего оператора. Для нетранзакционных хранилищ данных изменения данных, внесенные до возникновения ошибки, сохраняются.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/subquery-errors.html

Spec-Zone.ru

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