2012-05-02 72 views
3

爲什麼兩個查詢的結果相同? (我使用Northwind數據庫使用DISTINCT關鍵字時,爲什麼不會更改此查詢結果?

SELECT  ContactTitle 
     , COUNT(CustomerID) AS NumberOfCustomer 
FROM  dbo.Customers 
WHERE  ContactTitle LIKE '%sales%' 
GROUP BY ContactTitle 
HAVING  COUNT(*) >= 5 
ORDER BY NumberOfCustomer desc 

SELECT 
DISTINCT ContactTitle 
     , COUNT(CustomerID) AS NumberOfCustomer 
FROM  dbo.Customers 
WHERE  ContactTitle LIKE '%sales%' 
GROUP BY ContactTitle 
HAVING  COUNT(*) >= 5 
ORDER BY NumberOfCustomer desc 

結果是:

ContactTitle   NumberOfCustomer 
--------------------- ---------------- 
Sales Representative   17 
Sales Manager    11 
Sales Associate    7 
Sales Agent     5 

在我自己的理解,第二個查詢得到不同的標題和計算它的記錄,所以我期待結果將是沒有,因爲每個標題只有記錄計數爲1。

回答

3

這是查詢執行的工作原理。在您的第二條語句中,DISTINCT不會執行任何其他功能,因爲您的GROUP BY包含相同的列名稱ContactTitle已經爲您執行該操作。

1. FROM 
2. WHERE 
3. GROUP BY <-- You have specified the column `ContactTitle`, 
-- which means the results would be grouped by that column to product unique 
--result. 
4. HAVING 
5. SELECT <-- Adding DISTINCT on ContactTitle column here doesn't make much 
-- difference and it is actually redundant. DISTINCT is applied to the whole 
-- row but the resultset already contains distinct rows grouped by the column 
-- `ContactTitle`. 
6. ORDER BY 
+1

正確,除* *「在ContactTitle列上添加DISTINCT」*。 「DISTINCT」應用於整行,而不是列。 –

+0

謝謝你的插圖。你如何理解查詢執行計劃? – SkyDrive

+0

這裏的小故事(無恥廣告):[SELECT:order or processing](http://stackoverflow.com/questions/6545664/using-case-expression-column-in-where-clause/6545685#6545685) –

7

DISTINCT在其他操作之後完成。首先它執行已經使每行不同的GROUP BY,因此DISTINCT是多餘的。

+0

謝謝你的回答。 – SkyDrive

3

該區別適用於標題的計數。一旦你的選擇完成計算,它會從中創建不同的列表。

+0

謝謝你的回答。 – SkyDrive

3

DISTINCT將過濾來自結果集的重複記錄。由於在這種情況下沒有重複記錄,因此DISTINCT不起作用。

+0

謝謝你的回答。 – SkyDrive

相關問題