2012-05-02 2 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은 동일한 기능을하는 동일한 이름 인 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

단편 소설 (부끄러운 광고) : [SELECT : 주문 또는 처리] (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

관련 문제