Синтаксис SQL-запроса: использование псевдонима таблицы в подсчете недопустимо? Зачем? - PullRequest
2 голосов
/ 25 мая 2010

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

Ответы [ 4 ]

4 голосов
/ 25 мая 2010

COUNT(expression) подсчитает все строки, где expression не равно нулю. COUNT(*) является исключением, оно возвращает количество строк: * не является псевдонимом для my_table.*.

3 голосов
/ 25 мая 2010

Насколько я знаю, Count(Table.*) официально не поддерживается в спецификации SQL. Только Count(*) (количество всех возвращаемых строк) и Count(Table.ColumnName) (количество всех ненулевых значений в данном столбце). Так что, даже если СУБД поддерживает это, я бы рекомендовал не использовать его.

1 голос
/ 15 февраля 2011

Возможно, вы захотите найти количество записей, где test.column не равен NULL, если вы выполняете внешнее соединение. Поскольку каждая таблица должна иметь PK (который не равен нулю), вы должны иметь возможность считать строки, как это, если хотите:

select count(y.pk)
from x
left outer join y on y.pk = x.ck

COUNT (*) здесь не годится, потому что внешнее соединение создает пустую строку для таблицы с недостатком информации.

1 голос
/ 25 мая 2010

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

Просто используйте COUNT(*).

Этот запрос:

select count(test.column) from my_table test;

вернет вам количество записей, для которых test.column не равно NULL.

Этот запрос:

select test.* from my_table test;

просто вернет вам все записи с my_table.

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

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