2012-01-27 2 views
0

SELECT 쿼리를 최적화 할 수있는 방법이 있는지 궁금합니다. (참고 : 존재하지 않는 테이블에 대한 내 질문을 작성할 때 입력 한 올바른 구문이 없을 수도 있습니다.)SQL Server에서 사례 테스트를 최적화하십시오.

목표는 Table2 관련된 행이 세 번째 열의 값을 숫자로 설정하려면 원하는 경우 표 2의 관련 행 수 그렇지 않으면 Table3 관련된 행이 Table3 관련된 행 수를 설정하려면 원하는 경우. 그렇지 않으면, 나는 기본적으로 내가 (이가지 경우에) 두 번 같은 쿼리를 수행하고있어 사실을 좋아하지 않아 0

SELECT Id, Title, 
    CASE 
     WHEN EXISTS (SELECT * FROM Table2 t2 WHERE t2.RelatedId = Table1.Id) THEN 
      (SELECT COUNT(1) FROM Table2 t2 WHERE t2.RelatedId = Table1.Id) 
     WHEN EXISTS (SELECT * FROM Table3 t3 WHERE t3.RelatedId = Table1.Id) THEN 
      (SELECT COUNT(1) FROM Table3 t3 WHERE t3.RelatedId = Table1.Id) 
     ELSE 0 
    END AS RelatedCount 
    FROM Table1 

에 열 값을 설정합니다. 한 번만 쿼리를 수행하면서 원하는 것을 할 수 있습니까?

JOINUNION이 여러 개인 훨씬 더 큰 쿼리의 일부이므로 완전히 다른 접근 방식을 사용하는 것이 쉽지 않습니다.

답변

1

이 쿼리는 훨씬 더 잘 수행됩니다. 동일한 쿼리를 두 번 수행하는 것이 아닙니다. 상관 관계가있는 하위 쿼리이므로 행당 한 번 실행됩니다.

SELECT Id, Title, 
    coalesce(t2.Count, t3.Count, 0) AS RelatedCount 
    FROM Table1 t 
left outer join (
    SELECT RelatedId, count(*) as Count 
    FROM Table2 
    group by RelatedId 
) t2 on t1.Id = t2.RelatedId 
left outer join (
    SELECT RelatedId, count(*) as Count 
    FROM Table3 
    group by RelatedId 
) t3 on t1.Id = t3.RelatedId 
+0

저는 이것을 이해하려고 애 쓰고 있습니다. 당신이'RelatedId'에 가입하고 있기 때문에 이것에 의한'GROUP'의 이점은 무엇입니까? 또한'JOIN'을 사용하는 이유는 무엇입니까? 'COUNT (*)'를 별개의 열로 사용하는 것과 비슷하지 않겠는가? –

+0

@JonathanWood'GROUP BY '는'RelatedId' 당 몇개의 레코드를 세는지를 허용합니다. 나는 두 번째 문장을 따르지 않는다. 예? – RedFilter

+0

나는 그것을 얻는다라고 생각한다. 그것은'COUNT'가 적용되기 전에 그룹화되어 있으므로,'ON' 절은 우리가 원하는 합계를 반환합니다. T-SQL은 제 첫 번째 언어가 아니며 단지 제게 이상하게 보입니다. 일부 테스트를 실행 중입니다 ... –