2009-12-01 139 views
13

爲什麼我們不能在SQL中使用count(distinct *)?如何計算所有不同的行?SQL count(*)and distinct

+0

你是什麼意思的'不同的行'? – 2009-12-01 13:16:50

+0

你有整行中重複的行,你試圖找到什麼? – 2009-12-01 13:17:19

+0

現在,當我想到它,因爲我們的表是正常化的,我們不會有完全相同的行,所以它沒用的權利?這是原因嗎? – 2009-12-01 13:20:46

回答

27
select count(*) from (select distinct * from MyTable) as T 

雖然我強烈建議你重新考慮使用DISTINCT任何疑問。在很大比例的情況下,GROUP BY更合適(也更快)。

編輯:已經閱讀問題的意見,我要指出,你應該從未問DBMS做更多的工作比實際需要做才能獲得結果。如果您事先知道表格中不會有任何重複行,請不要使用DISTINCT

+0

@Christian - 嗨,從來沒有見過這樣做過。出於好奇,在我的最後一個現有的表上運行它,我得到'不正確的語法附近')''。在MS SQL SERVER中工作?注意 - 我的括號內的選擇完美運行 – Kamal 2009-12-01 13:26:19

+2

在Oracle上DISTINCT和GROUP BY具有相同的執行計劃,因爲使用GROUP BY實現了DISTINCT。所以應該沒有區別。 – 2009-12-01 13:27:48

+0

@Kamal:對不起,忘了SQL Server有點嵌套查詢。在末尾添加一個別名('as T')解決了這個問題。 – 2009-12-01 13:29:17

1

你的確可以。

但是,如果您有標識符,則不會有任何完全不同的行。但是,你可以爲實例來:

SELECT COUNT(DISTINCT SenderID) FROM Messages 
9

您可以選擇在你的桌子和組中的所有列...

SELECT column1, column2, column3, count(*) 
FROM someTable 
GROUP BY column1, column2, column3 
+0

這實際上並沒有得到什麼問題,但是。 – 2009-12-01 14:31:59

3

爲什麼不呢?

select 
    count(distinct name) 
from 
    people 
+0

因爲兩個人可能有相同的名字。 OP詢問COUNT(DISTINCT *)。 – 2009-12-01 13:18:49

+0

對不起,這是我回答時問題中的另一個文本。 – silent 2009-12-01 13:24:25

-2

UberKludge,並可以postgre具體,但

select count(distinct table::text) from table 
0

你可以嘗試CTE在SQL Server 2005

;WITH cte AS (
     SELECT DISTINCT Val1,Val2, Val3 
     FROM @Table 
) 
SELECT COUNT(1) 
FROM cte 

要回答這個問題,從文檔

指定所有行應計爲 ,以返回行中總數爲 的行 一張桌子。 COUNT()不參與 參數,不能與 DISTINCT一起使用。 COUNT()不需要 表達式參數,因爲通過 定義,它不使用 有關任何特定 列的信息。 COUNT(*)返回指定表中 行的數量,而不刪除重複項, 。它分別計算每行 。這包括包含空值的 行。

+0

當你說,「從文檔」哪些文件將是? – 2009-12-01 14:29:34

+0

Sql Server幫助文檔。 http://msdn.microsoft.com/en-us/library/ms175997.aspx – 2009-12-01 14:44:50

0

COUNT(*)是匹配查詢的行數。

一行包含獨特信息,如rowid。所有行按定義不同。

您必須對某些字段中值的不同實例進行計數。

+3

爲什麼一行包含唯一信息?它不必......它可能應該但它不需要*。 – Murph 2009-12-01 13:23:19

0

某些languajes可能無法處理'distinct *',因此,如果您希望通過很多列進行區分,您可能需要使用'distinct ColumnA || ColumnB',在判斷它們是否不同之前結合這些值。請注意,您的變量是否是數字型的,您的數據庫處理程序是否可以自動對字符串進行類型轉換。

+1

這也不是一個完整的證明方法。例如('test','string')和('tes','t string')看起來是一樣的。你可以用填充字符串來做一些事情,但是會變得混亂。更好的IMO只是使用DISTINCT的子查詢,然後從中獲得COUNT。 – 2009-12-01 14:27:51

-2
select count (Tag_no) from tab_raw_tag_value where tag_no in (select distinct tag_no from tab_raw_tag_value) 
+0

這不回答這個問題 – 2012-10-04 08:54:56