Прежде всего, буквальный ответ: если подзапрос, который вы используете в качестве выражения, возвращает более одной строки, измените его так, чтобы он возвращал не более одной строки.
Я собираюсь взять дикийугадай и скажи, что ты хочешь найти работников, которые зарабатывают меньше, чем средняя зарплата.Решение будет следующим:
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
- он возвращает среднее значение всех строк зарплаты, соответствующих этому конкретному имени, а не среднее значение всех строк зарплаты, сгруппированныхпо имени.Первое - это одно значение (для одного конкретного человека), второе - одно значение на человека (и, следовательно, ошибка).