Почему что-то вроде select count ((выберите * из производителей)) от производителей;Работа? - PullRequest
0 голосов
/ 24 ноября 2010

Я определил следующий запрос:

select count((select * from producers)) from producers;

Предполагается, что producers таблица с 3 столбцами (A, B и C) и 2 строками:

A B C
-----
0 1 2
3 4 5

Я бы ожидал следующий вывод:

2
2

Это не работает. Хотя сам запрос в основном бесполезен (даже если бы он работал, он не дал бы никакого полезного результата), я хотел бы попытаться понять, почему он не выполняется.

(select * from producers)

В результате будет получен список строк с информацией обо всех атрибутах таблицы producers.

select count((select * from producers)) from producers;

Эта строка будет отображать для каждой строки в producers, число 2 (количество элементов в producers).

Почему это не работает? Ограничение SQL? Что-то не так с логикой, которой я здесь следую?

Спасибо

Ответы [ 5 ]

3 голосов
/ 24 ноября 2010

Насколько я знаю, это ограничение SQL. Подзапросы недопустимы в выражении COUNT. Очевидно, (select * from producers) - это подзапрос, поэтому он там не разрешен.

Я думаю, что ваше недоразумение заключается в том, что вы думаете, что вызовете функцию как COUNT(SELECT * FROM producers), тогда как в SQL это похоже на SELECT COUNT(*) FROM producers.

Функции типа MAX, MIN, SUM и COUNT являются агрегатными функциями, что означает, что они принимают скалярный аргумент, но выполняются один раз для каждой строки, накапливая результаты на каждой итерации. Таким образом, SELECT MAX(column) FROM table выполняет функцию MAX один раз для каждой строки в table, в то время как вы можете подумать, что MAX выполняется один раз и передается в каждую строку в table.

Сравните это с такими операторами, как IN, EXISTS, ANY и ALL, которые имеют подзапрос в качестве аргумента. Они эффективно передают все результаты своего подзапроса каждый раз, когда их вызывают.

3 голосов
/ 24 ноября 2010

Это должно быть просто

Select count(1) from producers;

Если вы спрашиваете о внутреннем выборе, то внутренний выбор должен быть частью предложения from, например,

Select count(1) from (select * from producers)

Оба эти слова делаютто же самое, но первый более эффективен.

1 голос
/ 24 ноября 2010

COUNT() функция ожидает только одно значение.

Это вернет то, что вы хотите:

    SELECT COUNT(*)
      FROM producers p1
CROSS JOIN producers p2
  GROUP BY p1.A
0 голосов
/ 24 ноября 2010

"Почему Count () ожидает только значение? Разве Count () не принимает в качестве входных данных набор строк?"

Count принимает выражение.Если выражение оценивается как ноль, то оно не считается.В противном случае это так.

Если в таблице пять строк, а в одном столбце три фактических значения и два пустых значения, то при подсчете этого столбца будет возвращено три.), COUNT (SIZE) даст 3 и 3.

COUNT (*) является особенным в том смысле, что он дает количество строк в таблице, независимо от каких-либо нулей.t / не будет работать с (выберите * из производителей) или даже (1,3), поскольку они не являются выражениями, которые могут быть интерпретированы как нулевые или не нулевые.

0 голосов
/ 24 ноября 2010

Ключевое слово Count предназначено для подсчета строк данных, а не столбцов данных.

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

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