SQL查询语法:在计数中使用表别名无效?为什么?

时间:2010-05-25 15:21:01

标签: sql oracle oracle10g ora-01747

有人可以向我解释为什么以下查询无效?我正在针对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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

只需使用COUNT(*)

此查询:

select count(test.column) from my_table test;

将返回test.column不是NULL的记录数。

此查询:

select test.* from my_table test;

只会从my_table返回所有记录。

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

答案 3 :(得分:1)

如果您正在进行外连接,您可能有理由想要找到test.column不为NULL的记录数。由于每个表都应该有一个PK(非空),如果你愿意,你应该可以像这样计算行数:

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

COUNT(*)在这里不合适,因为外部联接正在为缺乏信息的表创建一个空行。