2013-05-06 6 views
2

나는 다음과 같은 쿼리 SO에 질문 중 하나를 대답하위 쿼리없이 두 번 그룹화 할 수 있습니까?

SELECT s.address 
FROM shop s 
JOIN visit v ON s.shopid = v.shopid 
JOIN customer c ON v.customerid = c.customerid 
WHERE c.cname = 'John' 
GROUP BY 
s.address 
, c.customerid 
HAVING COUNT(*) > 1 

이 잘 작동하지만 쿼리의 기준을 충족 주어진 가게 2 요한의 이상이있는 경우 중복 된 주소를 반환합니다, 그래서 내 대답을 수정했습니다 :

SELECT DISTINCT a.address 
FROM 
(
SELECT s.address 
FROM shop s 
JOIN visit v ON s.shopid = v.shopid 
JOIN customer c ON v.customerid = c.customerid 
WHERE c.cname = 'John' 
GROUP BY 
s.address 
, c.customerid 
HAVING COUNT(*) > 1 
) a 

이제 제 질문은 : 집계 식을 평가할 때 그룹화를 수행하고 단일 쿼리에서 선택하기 전에 가능합니까?

+0

아마도 사용하는 테이블에서 뚜렷한 고객을 데려 갈 수 있습니다. – Avi

+0

많은 테이블의 고객은 가입 할 때 상점에서 복제가 발생합니다. 많은 John이 단일 상점에서 구매할 수 있기 때문입니다. – kyooryu

+0

만약 u가 혼자서 주소를 가져 가야한다면 완전히 테이블 가게를 가져 가야합니다. (고객 ID, 가게 주소 등)를 시도해 볼 수 있습니다. – Avi

답변

2

이 작업을 수행 할 수 있습니다 직접

SELECT distinct s.address 
FROM shop s 
JOIN visit v ON s.shopid = v.shopid 
JOIN customer c ON v.customerid = c.customerid 
WHERE c.cname = 'John' 
GROUP BY 
s.address 
, c.customerid 
HAVING COUNT(*) > 1 

나는 이것이 당신이 원하는 생각합니다.

SELECT은 RBDMS에서 마지막으로 수행 한 것입니다 (물론, 실제로는 순서입니다). 먼저 필터링하고 그룹화 한 다음 선택하고 순서를 매 깁니다.

그래서 그룹 별을 사용할 수 있습니다.

그룹화하려는 입력란을 표시 할 필요가 없습니다. 그러나 그룹화되지 않았거나 집계 함수에서 사용되는 필드는 표시 할 수 없습니다.

+0

오, 엄선되기 직전에 분명히 작동합니까? 그것이 내 대답의 첫 아이디어 였지만, 나는 뚜렷한 것이 더 일찍 평가 될 것이라고 생각했다. 그 후로 – kyooryu

+0

nono. 먼저 where 절이 평가 된 후 그 그룹과 having (있는 경우)이 평가됩니다. 그런 다음 수집 된 데이터를 사용하여 집계 함수, 문자열 함수 등을 사용할 수 있습니다. 별개의 것은 다른 것으로 생각할 수 있습니다. –

+1

나를 위해 그것을 모두 정리해 주셔서 감사합니다 :) – kyooryu

관련 문제