Синтаксис запроса SQL: Использование псевдонима таблицы в количестве недействительна? Почему?
Вопрос
Может ли кто-нибудь, пожалуйста, объясните мне, почему следующий запрос недействителен? Я запускаю этот запрос против базы данных Oracle 10G.
select count(test.*) from my_table test;
Я получаю следующую ошибку: ORA-01747: неверный user.table.column, table.column или спецификация столбца
Однако, следующие два запроса действительны.
select count(test.column) from my_table test;
select test.* from my_table test;
Решение
COUNT(expression)
будет посчитать все ряды, где expression
не ноль. COUNT(*)
Это исключение, он возвращает количество строк: *
не псевдоним для my_table.*
.
Другие советы
Насколько я знаю, Count(Table.*)
официально не поддерживается в спецификации SQL. Только Count(*)
(подсчитать все строки возвращено) и Count(Table.ColumnName)
(Подсчитайте все ненулевые значения в данном столбце). Итак, даже если СУБД поддерживает его, я бы порекомендовал против его использования.
Этот синтаксис работает только в PostgreSQL
и только потому, что он имеет запись данных (для которого test.*
это значимое выражение).
Просто использовать COUNT(*)
.
Этот запрос:
select count(test.column) from my_table test;
вернет вам количество записей, для которых test.column
не является NULL
.
Этот запрос:
select test.* from my_table test;
просто вернет вас всех записей из my_table
.
COUNT
Как таковой, вероятно, единственный агрегат, который имеет смысл без параметров, а использование выражения, как COUNT(*)
это просто способ вызвать функцию, не предоставив к нему никаких фактических параметров.
Вы можете разумно хотеть найти количество записей, где Test.Column не является NULL, если вы выполняете внешнее соединение. Поскольку каждая таблица должна иметь PK (что не является NULL), вы сможете подсчитать такие строки, если хотите:
select count(y.pk)
from x
left outer join y on y.pk = x.ck
COUNT (*) Здесь нет хорошего здесь, потому что внешнее соединение создает нулевой ряд для таблицы, которая является недостаточным в информации.