Синтаксис запроса SQL: Использование псевдонима таблицы в количестве недействительна? Почему?

StackOverflow https://stackoverflow.com/questions/2906017

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top