SQL查询语法:在计数中使用表别名无效?为什么?
有人能给我解释一下为什么下面的查询是无效的吗?我正在对Oracle 10g数据库运行此查询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; 将统计表达
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的一部分提供的语法的一部分,作为表达式的替代。