2012-05-02 8 views
3

なぜ2つのクエリの結果は同じですか?結果は(私はの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 

、2番目のクエリは、個別のタイトルを取得し、そのレコードをカウントするので、各タイトルは1のレコード数しかないので、結果は何もないと予想しています。正しいですか?

答えて

3

これは、クエリの実行方法です。 2番目のステートメントでDISTINCTは、同じ列名ContactTitleを含むGROUP BYがすでにその操作を実行しているため、追加機能は実行されません。

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

短編小説(恥知らずの広告):[選択:注文または処理](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

関連する問題