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

Sql 为什么COUNT(DISTINCT(*)不起作用?,sql,sql-server,Sql,Sql Server,我仍然很惊讶为什么这么简单的查询不起作用: SELECT COUNT(DISTINCT *) FROM dbo.t_test 何处为 SELECT COUNT(DISTINCT col1) FROM dbo.t_test 及 工作 替代方案是什么 编辑: DISTINCT*检查col1、col2……的组合键的唯一性,。。。并返回这些行。我希望COUNTDISTINCT*只返回这样的行数。我在这里遗漏了什么吗?它不起作用,因为您只能在COUNTDISTINCT中指定一个表达式。。。根

我仍然很惊讶为什么这么简单的查询不起作用:

SELECT COUNT(DISTINCT *) FROM dbo.t_test     
何处为

SELECT COUNT(DISTINCT col1) FROM dbo.t_test

工作

替代方案是什么

编辑:


DISTINCT*检查col1、col2……的组合键的唯一性,。。。并返回这些行。我希望COUNTDISTINCT*只返回这样的行数。我在这里遗漏了什么吗?

它不起作用,因为您只能在COUNTDISTINCT中指定一个表达式。。。根据:

如果仔细观察,您会发现允许的语法不包括COUNTDISTINCT*

另一种选择是:

SELECT COUNT(*) FROM
(
    SELECT DISTINCT * FROM dbo.t_test 
) T1

举个简单的例子,假设有两列,a和B

A    B
1    100
2    100
3    100

有三个不同的A值,但只有一个不同的B值。COUNTDISTINCT*不可能返回单个有意义的值。这就是为什么这种语法不起作用。

除了其他人所说的以外:

需要注意的一点是,如果允许在具有主键的表上执行countdistinct*,则它与select count*相同

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


由于每个非平凡的表都应该有一个主键,因此该规则只有极少数例外情况countdistinct*可以被count*替换。

事实是,SQL Server或任何其他SQL实现不应该在阳光下做所有事情

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

COUNT aggregate函数通常实现为一个流式聚合,带有单个项的门,无论是*记录计数,只要使用静态令牌,或只有在不为null或不为唯一colname时才使用colname增量令牌,一个散列/存储桶带有一个键

当您要求COUNTDISTINCT*或为此,COUNTDISTINCT a、b、c-是的,如果有一天某些RDBMS认为适合实施它,它肯定可以为您完成;但是这是非常罕见的,2增加了解析器的工作,3增加了计数实现的复杂性


马克有。

谢谢乔!我更新了关于你解释的问题。
SELECT COUNT(*) FROM
(
    SELECT DISTINCT * FROM dbo.t_test 
) T1
A    B
1    100
2    100
3    100