为什么COUNT(DISTINCT(*))不起作用?

rkg*_*rkg 6 sql sql-server

我仍然感到惊讶,为什么这样简单的查询不起作用:

SELECT COUNT(DISTINCT *) FROM dbo.t_test     
Run Code Online (Sandbox Code Playgroud)

在哪里

SELECT COUNT(DISTINCT col1) FROM dbo.t_test
Run Code Online (Sandbox Code Playgroud)

SELECT DISTINCT * FROM dbo.t_test 
Run Code Online (Sandbox Code Playgroud)

作品.

有什么选择?

编辑:

DISTINCT *检查(col1,col2,...)的组合键的唯一性并返回这些行.我期望COUNT(DISTINCT*)只返回这些行的数量.我在这里错过了什么吗?

Mar*_*ers 12

它不起作用,因为您只能COUNT(DISTINCT ...)根据文档指定单个表达式:

COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
Run Code Online (Sandbox Code Playgroud)

如果仔细观察,可以看到允许的语法包括在内COUNT(DISTINCT *).

替代方案是这样的:

SELECT COUNT(*) FROM
(
    SELECT DISTINCT * FROM dbo.t_test 
) T1
Run Code Online (Sandbox Code Playgroud)


Ric*_*iwi 6

问题的真相是SQL(服务器)或任何其他SQL实现不应该在阳光下做所有事情.

有理由将SQL语法限制为某些元素,从解析层到查询优化,再到结果的可预测性,只是常识.

COUNT聚合函数通常实现为具有单个项的门的流聚合,可以是*(记录计数,只使用静态令牌),或者colname(仅当非空时增量令牌)或distinct colname(带有一个键的哈希/桶) ).

当你提出要求COUNT(DISTINCT *)或者问题时,COUNT(DISTINCT a,b,c)- 是的,如果某个RDBMS认为有一天能够实现它,肯定可以为你完成; 但它是(1)不常见(2)向解析器添加工作(3)增加了COUNT实现的复杂性.

马克有正确的选择.


小智 5

除了其他人所说的之外:

需要注意的一件事是,count(distinct *)在具有主键的表上执行 a (如果允许的话)将与select count(*).

这是因为unique *包含 PK 列,因此每一行都与其他行不同。

由于每个重要的表都应该有一个主键(该规则只有count(distinct *)少数例外),因此无论如何都可以“替换” count(*)