MySQL сказал: # 1242 - Подзапрос возвращает более 1 строки в запросе - PullRequest
0 голосов
/ 03 марта 2019
SELECT DISTINCT w.cname
FROM works w 
WHERE 
(SELECT DISTINCT w.cname, AVG(w.salary)
FROM works w
WHERE 1
 GROUP BY w.cname
)

<

(SELECT DISTINCT w.cname,AVG(w.salary)
FROM works w
WHERE 1
 GROUP BY w.cname
)

MySQL сказал:

1242 - Подзапрос возвращает более 1 строки

Что мне делать ???

1 Ответ

0 голосов
/ 03 марта 2019

Прежде всего, буквальный ответ: если подзапрос, который вы используете в качестве выражения, возвращает более одной строки, измените его так, чтобы он возвращал не более одной строки.

Я собираюсь взять дикийугадай и скажи, что ты хочешь найти работников, которые зарабатывают меньше, чем средняя зарплата.Решение будет следующим:

SELECT -- add DISTINCT if needed
  w.cname
FROM
  works w
WHERE
  w.salary < (SELECT AVG(w2.salary) FROM works w2)

Обратите внимание, что подзапрос здесь (SELECT AVG(w2.salary) FROM works w2) будет всегда возвращать одно значение, поскольку нет условия GROUP BY.(Кроме того, поскольку этот экземпляр таблицы works не имеет ничего общего с другим, потому что вы получаете что-то совершенно не связанное с этим, рекомендуется (и требуется какой-либо СУБД) использовать другую таблицупсевдоним - следовательно, w2.)

Обратите внимание, что, поскольку вы можете ссылаться на исходную таблицу в подзапросах, вы можете использовать данные в предложении FROM внешнего запроса для фильтрации подзапроса.Например, если вы хотите возвращать каждый экземпляр людей, зарабатывающих менее их собственную среднюю зарплату:

SELECT DISTINCT
  w.cname, w.salary
FROM
  works w
WHERE
  w.salary < (SELECT AVG(w2.salary) FROM works w2 WHERE w2.cname = w.cname)

Обратите внимание, как различные псевдонимы таблиц (w и w2)важно здесь.Кроме того, этот подзапрос по-прежнему возвращает только одну строку , поскольку фильтр по имени содержится в предложении WHERE - он возвращает среднее значение всех строк зарплаты, соответствующих этому конкретному имени, а не среднее значение всех строк зарплаты, сгруппированныхпо имени.Первое - это одно значение (для одного конкретного человека), второе - одно значение на человека (и, следовательно, ошибка).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...