我仍然感到惊讶,为什么这样简单的查询不起作用:
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)
问题的真相是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(*)。
| 归档时间: |
|
| 查看次数: |
7554 次 |
| 最近记录: |