2

有人可以向我解释为什么以下查询无效吗?我正在针对 Oracle 10g 数据库运行此查询。

select count(test.*) from my_table test;

我收到以下错误:ORA-01747: invalid user.table.column, table.column, or column specification

但是,以下两个查询是有效的。

select count(test.column) from my_table test;

select test.* from my_table test;
4

4 回答 4

4

COUNT(expression)将计算所有expression不为空的行。COUNT(*)是一个例外,它返回行数:*不是my_table.*.

于 2010-05-25T15:28:15.423 回答
3

据我所知,Count(Table.*)在 SQL 规范中没有正式支持。仅Count(*)(计算所有返回的行)和Count(Table.ColumnName)(计算给定列中的所有非空值)。所以,即使 DBMS 支持它,我也建议不要使用它。`

于 2010-05-25T15:39:57.027 回答
1

此语法仅适用于PostgreSQL并且仅因为它具有记录数据类型(对于它test.*是有意义的表达式)。

只需使用COUNT(*).

这个查询:

select count(test.column) from my_table test;

将返回test.columnnot的记录数NULL

这个查询:

select test.* from my_table test;

只会返回你的所有记录my_table

COUNT因此,这可能是唯一没有参数才有意义的聚合,并且使用表达式 likeCOUNT(*)只是一种调用函数而不向其提供任何实际参数的方法。

于 2010-05-25T15:28:59.197 回答
1

如果您正在执行外连接,您可能有理由希望找到 test.column 不为 NULL 的记录数。由于每个表都应该有一个 PK(不为空),因此如果需要,您应该能够像这样计算行数:

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

COUNT(*) 在这里不好,因为外连接正在为信息不足的表创建一个空行。

于 2011-02-15T00:11:53.907 回答