2010-07-07 2 views
6

세 개의 테이블 'A', 'B'및 'C'가 있습니다. 나는 'A'와 'B'에 대한 질의를 가지고 있지만, 나는 하나 이상의 ('얼마나 많은'상관 없어) 'C'가 외국어 인 'A'가 있는지 여부를 알려주는 필드를 추가하고 싶다.왼쪽 조인에서 행을 반환하는 경우 '1'을 반환하는 더 좋은 방법은 무엇입니까?

SELECT A.A_id, A.col_2, col_3, B.col_2, A.col_4 
      count(C.id) as C_count 
FROM  A 
JOIN  B ON (A.B_id = B.B_id) 
LEFT JOIN C ON (A.A_id = C.A_id) 
WHERE  A.A_id = ? 
GROUP BY A.A_id, A.col_2, col_3, B.col_2, A.col_4 
ORDER BY CASE WHEN A.col_2 = ? 
       THEN 0 
       ELSE 1 
      END, col_3; 

그것은 조금 비효율적 인 것 같다, 내가 정말 원하는 모든이 있는지 어디에 나는 믿는다 때문에 또한 GROUP BY의 모든 필드를 나열해야하므로이 두 : 여기

내가 가진 무엇 적어도 하나 이상의 일치 여부. 이것이 개선 될 수 있습니까? 당신이 맞아요,하지만이 경우)

+1

존재한다. 수를 정렬하고 표로 만드는 것은 비용이 많이 들지만 더 많은 비용이 드는 것은 DB가 그 수를 얻기 위해 표 C의 모든 행을 거쳐야한다는 것입니다. 첫 번째로 일치하는 행을 찾으면 곧바로 EXISTS 솔루션을 사용하여 검색을 중지 할 수 있습니다. –

+0

좋은 설명, @Tom. –

답변

13

사용 ... 대신 하위 쿼리와 쿼리가 비효율적하지 않습니다 열 이름을 많이 입력해야했다해서

Select A.A_id, A.col_2, col_3, 
    B.col_2, A.col_4, 
    Case When Exists (Select * From C 
         Where A_id = A.A_id) 
     Then 1 Else 0 End As C_Exists 
From A Join B 
    On (A.B_id = B.B_id) 
Where A.A_id = ?  
Order By Case When A.col_2 = ? 
      Then 0 Else 1 End, col_3; 
+0

+1 존재 :-) – corsiKa

+0

우수. EXPLAIN PLAN은 더 나아 졌다고 말합니다. 내가 받아 들일 때까지 3 분. –

+1

@Paul Tomblin : 그것은 EXISTS가 조건에 맞는 첫 번째 일치가 발견되는 즉시 true를 반환하기 때문에 - EXISTS가 모든 일치 기준을 검사 할 필요가 없습니다. –

관련 문제