2011-02-15 134 views
2

我仍然驚訝爲什麼這麼簡單的查詢是不工作:爲什麼COUNT(DISTINCT(*))不起作用?

SELECT COUNT(DISTINCT *) FROM dbo.t_test  

凡爲

SELECT COUNT(DISTINCT col1) FROM dbo.t_test 

SELECT DISTINCT * FROM dbo.t_test 

作品。

什麼是替代方案?

編輯:

DISTINCT *檢查唯一性的組合密鑰(COL1,COL2,...)並返回這些行。我期望COUNT(DISTINCT *)只返回這樣的行數。我在這裏錯過了什麼嗎?

回答

3

事情的真相是,SQL(服務器)或任何其他SQL實現不應該做的一切在陽光下

有理由將SQL語法限制爲某些元素,從解析層到查詢優化到結果的可預測性,僅僅是常識。

COUNT聚合函數與對單個項目的柵極流聚集正常開展的,是它*(記錄數,只需使用一個靜態的令牌),或colname(增量令牌只有當不爲空)或distinct colname(一個密鑰的哈希/桶)。

當你詢問COUNT(DISTINCT *)或者- 是的,如果某些關係型數據庫管理系統認爲適合於某一天實施它,那麼肯定會爲你完成;但是(1)很少見(2)爲解析器添加了工作(3)增加了COUNT實現的複雜性。

馬克有the correct alternative

+0

+1謝謝。很好的回答! – rkg 2011-02-15 23:26:32

10

它不工作,因爲你只能在COUNT(DISTINCT ...)指定一個表達式爲每documentation

COUNT ({ [ [ ALL | DISTINCT ] expression ] | * }) 

如果你仔細看,你可以看到,在允許的語法包括COUNT(DISTINCT *)

另一種方法是這樣的:

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

+1很好的答案。 – RobertPitt 2011-02-15 22:55:50

2

舉一個簡單的例子,假設你有兩列,A和B.

A B 
1 100 
2 100 
3 100 

有三種不同的A值,但只有一個不同B值。 COUNT(DISTINCT *)將不可能返回單個有意義的值。這就是爲什麼該語法無法工作。

+0

謝謝喬!我更新了有關您的解釋的問題。 – rkg 2011-02-15 23:02:08

2

除了什麼其他人說:

有一點要注意的是,這樣做,因爲它有主鍵可以等同於一個select count(*)表中的count(distinct *)(如果被允許)。

這是因爲distinct *包含PK列,因此每行都不同於其他行。

成爲每一個不平凡的表應該有一個主鍵(只有非常少數例外情形規則)count(distinct *)可以「改爲」與count(*)反正。