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