Однострочный подзапрос возвращает более одной ошибки строки для функции COUNT()

63
5

Я пытаюсь понять, почему это приведет к error-

select count((select 1 br from dual
union
select 2 br from dual))
from dual;

ORA-01427: single-row subquery returns more than one row

Но это выиграло t-

select count(br)
from (select 1 br from dual
union
select 2 br from dual);

BR
----------
2

спросил(а) 2021-01-19T18:58:18+03:00 6 месяцев, 1 неделя назад
1
Решение
109

Взгляните на синтаксис функции COUNT здесь:

enter image description here

Эта функция принимает выражение как аргумент.

Теперь рассмотрим определение выражения здесь.

Выражение представляет собой комбинацию одного или нескольких значений, операторов и функций SQL, которые оцениваются значением.

Значение - означает одно, одно, скалярное, индивидуальное, простое, атомное значение

Не так много значений, как вектор, массив, таблица или набор результатов.

Только одно значение, например 2 или 10.

Выражение может иметь много форм, может быть даже подзапросом, но SQL ограничивает этот подзапрос специальной формой, называемой скалярным подзапросом, см. Это:

выражение: =

enter image description here

Скалярное подзапрос определяется здесь

Скалярное выражение подзапроса - это подзапрос, который возвращает ровно одно значение столбца из одной строки.

Так как подзапрос в вашем запросе возвращает две строки, он не соответствует определению скалярного подзапроса, и это является причиной этой ошибки:

ORA-01427: однострочный подзапрос возвращает более одной строки

EDIT: Вопрос № 2: Но не считается ли подсчет количества строк в результирующем наборе?

Да, конечно. Счетчик является одной из совокупных функций.

См. Эту главу: http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions003.htm#SQLRF20035, а также примеры здесь: http://docs.oracle.com/cd/E11882_01/server. 112/e26088/statements_10002.htm # SQLRF55380

агрегированные функции возвращают одну строку результата на основе групп строк, а не на отдельные строки. Агрегатные функции могут отображаться в списках выбора и в предложениях ORDER BY и HAVING. Они обычно используются с предложением GROUP BY в инструкции SELECT, где Oracle Database делит строки запрошенной таблицы или представления на группы. В запросе, содержащем предложение GROUP BY, элементами списка выбора могут быть агрегированные функции, выражения GROUP BY, константы или выражения, содержащие один из них. Oracle применяет агрегированные функции к каждой группе строк и возвращает единственную строку результата для каждой группы.

Если вы опускаете предложение GROUP BY, тогда Oracle применяет агрегированные функции в списке выбора ко всем строкам в запрошенной таблице или представлении. Вы используете агрегированные функции в предложении HAVING, чтобы исключить группы из результата на основе результатов агрегатных функций, а не по значениям отдельных строк запрашиваемой таблицы или представления.

Говоря простыми словами, агрегированные функции могут использоваться только в запросах с предложениями GROUP BY и HAVING, например:

SELECT count( x )
FROM table
......
GROUP BY yyy

Особый случай - когда вы опускаете GROUP BY:

Если вы опускаете предложение GROUP BY, тогда Oracle применяет агрегированные функции в списке выбора ко всем строкам в запрошенной таблице или представлении.

SELECT count( x )
FROM table

Но все же в этих запросах count может принимать только выражение (скалярный подзапрос) или * как аргумент.

ответил(а) 2021-01-19T18:58:18+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема