Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询语法:在计数中使用表别名无效?为什么?_Sql_Oracle_Oracle10g_Ora 01747 - Fatal编程技术网

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

SQL查询语法:在计数中使用表别名无效?为什么?,sql,oracle,oracle10g,ora-01747,Sql,Oracle,Oracle10g,Ora 01747,有人能给我解释一下为什么下面的查询是无效的吗?我正在对Oracle 10g数据库运行此查询 select count(test.*) from my_table test; 我得到以下错误:ORA-01747:无效的user.table.column、table.column或column规范 但是,以下两个查询是有效的 select count(test.column) from my_table test; select test.* from my_table test; 将统计表达

有人能给我解释一下为什么下面的查询是无效的吗?我正在对Oracle 10g数据库运行此查询

select count(test.*) from my_table test;
我得到以下错误:ORA-01747:无效的user.table.column、table.column或column规范

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

select count(test.column) from my_table test;

select test.* from my_table test;

将统计
表达式
不为空的所有行
COUNT(*)
是一个例外,它返回行数:
*
不是
my_表的别名。*

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

只需使用
COUNT(*)

此查询:

select count(test.column) from my_table test;
select test.* from my_table test;
将返回
test.column
不为
NULL
的记录数

此查询:

select count(test.column) from my_table test;
select test.* from my_table test;
将只返回
我的\u表
中的所有记录


COUNT
本身可能是唯一一个没有参数的聚合,使用像
COUNT(*)
这样的表达式只是调用函数的一种方式,而不向函数提供任何实际参数。

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

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

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

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

因为Oracle在支持标准SQL方面存在差距。@Bill:
MySQL
SQL Server
也不支持这种语法。@Quassnoi:MySQL确实支持这种语法(我刚刚用版本5.1.46测试了它)。我还没有测试SQL Server。@比尔:
CREATE TABLE t_count(id INT不为NULL);从t_COUNT中选择COUNT(t_COUNT.*)。您的SQL语法有错误;检查与MySQL服务器版本相对应的手册,以获取第行“*)FROM t_count”附近使用的正确语法1@BillKarwin:
SELECT COUNT(test.*)FROM MY_TABLE test
失败—“SQL Server 2005上靠近“*”的语法不正确。COUNT(*)和COUNT(column)之间有一个主要区别:前者统计所有行;后者统计列值不为NULL的行。它们是不可互换的。对于oracle,“原因”是count()需要表达式,而[table.]*不是表达式,而是作为SELECT的一部分提供的语法的一部分,作为表达式的替代。