有人可以向我解释为什么以下查询无效?我正在针对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;
答案 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(*)在这里不合适,因为外部联接正在为缺乏信息的表创建一个空行。