2014-04-27 4 views
0

두 테이블, PolicyCoverage이 있습니다. Coverage(policyID)Policy(policyID)을 참조하는 외래 키입니다. Coverage에도 열 covTypeIDincurred이 있습니다. 정책 당 여러 보상 범위가 있습니다. 각 정책에 대해 단 하나의 행으로 이러한 테이블을 조인하는 쿼리를 작성했습니다. 이것은 내가 생각 해낸 것입니다 :T-SQL 다중 조인 대안

select polNo, alIncur, apdIncur, cargoIncur 
from Policy as P 
left join (
    select policyID, incurred as alIncur 
    from Coverage 
    where covTypeID = 1 
) as ALC on ALC.policyID = P.policyID 
left join (
    select policyID, incurred as apdIncur 
    from Coverage 
    where covTypeID = 2 
) as APDC on APDC.policyID = P.policyID 
left join (
    select policyID, incurred as cargoIncur 
    from Coverage 
    where covTypeID = 3 
) as CARGOC on CARGOC.policyID = P.policyID; 

나는이 쿼리는 범위 테이블을 통해 세 개의 패스를하게 알고 내가 JOIN들뿐만 아니라 매우 느린 것을 들었습니다. 이 작업을 수행하는 더 빠른 방법이 있다고 생각합니다. 가장 좋은 방법이 무엇인지 궁금합니다.

답변

1

당신은 하위 쿼리없이 쿼리를 다시 작성할 수 있습니다,하지만 난 그 성능에 영향을 미칠 것이라고 생각하지 않는다 : 당신이 Coverage(PolicyId, covTypeID)에 인덱스가있는 경우

select p.polNo, ALC.alIncur, APDC.apdIncur, CARGOC.cargoIncur 
from Policy P left join 
    Coverage ALC 
    on ALC.policyID = P.policyID and ALC.covTypeID = 1 left join 
    Coverage APDC 
    on APDC.policyID = P.policyID and APDC.covTypeID = 2 left join 
    Coverage CARGOC 
    on CARGOC.policyID = P.policyID and CARGOC.covTypeID = 3; 

이 쿼리는 좋은 성능을해야합니다.

하나의 대안이 다른 행에 서로 다른 적용 범위를 넣어하는 것입니다 : 재 작성에 대한

select p.polNo, c.covTypeID, 
     (case when c.covTypeID = 1 then 'ALC' 
      when c.covTypeID = 2 then 'APDC' 
      when c.covTypeID = 3 then 'CARGOC' 
     end) as which 
from Policy P left join 
    Coverage c 
    on c.policyID = P.policyID 
where c.covTypeID in (1, 2, 3); 
+0

감사합니다, 그것은 훨씬 더 간결 내가 가진 것보다입니다. 그렇다면 성과를 향상시킬 방법이 없다고 생각하십니까? 나는 그것이 나의 응용을 위해 너무 느리지 않을 것이지만 지식을 위해서 알고 싶다. –

+0

올바른 색인을 사용하는 테이블에서 세 조인은 매우 빠릅니다. 이 경우 성능에 대해 걱정하지 않아도됩니다. –

+0

멋진 정보 고든, 고마워. –