2013-02-04 3 views
4

SQL Server 2008에서 다음과 같은 방법이 있습니까?SQL Server - 조건부 출력 적용

외부 적용 (조인) 테이블을 조건에 따라 지정할 수 있습니까?

declare @bGetExtendedInfo bit 
set @bGetExtendedInfo = 1 

declare @param nvarchar(24) 
set @param = 'CO-02-BBB' 

select t1.*, t2.ID 
from t1 
outer apply (
       case when @bGetExtendedInfo= 0 
        then (select 0) as ID /* dummy value */ 
        /*really expensive query trying to avoid when extended info is not needed*/ 
        else (select top 1 ID from tbl1 where tbl1.code = @param) 
       end 
      ) t2 
+0

고든과 JW에게 감사드립니다. 정말 좋은 기술을 배우는데 도움이되었으므로 둘 다 답으로 받아 들여야합니다. 그러나, 내가 뭘 하려는지 충분한 정보를 제공하지 않았다는 것을 알고 있습니다. 내 편집 된 질문을 참조하십시오. – mmmmmm

답변

4

당신은 조인이 할 쉽게 할 수 다음 union all 또한 최적화를 도움이 될 것입니다 전에

SELECT t1.*, t2.* 
FROM t1 cross join 
     (SELECT * 
     FROM (SELECT top 1 tb10.*, 0 as bCcond src FROM tb10 
       UNION ALL 
       SELECT top 1 tb11.*, 1 as bCcond src FROM tb11 
      ) t 
     WHERE @bCond = bCcond 
     ) t2 

일 (가) top 더 나은 생산 테이블이 실제로 복잡한 조인 인 경우 쿼리 계획.

또한 order by없이 top을 수행하는 것은 일반적으로 싫은 일입니다. 그것은 다른 호출과 다른 행을 반환 할 수 있지만 행이 무작위로 보장되지 않습니다.

+0

주문하지 않고 상단 _without_ 주문 하시겠습니까? – Bridge

+0

@ 브리지. . . 제가 쓰는 것 대신에 제가 의미하는 것을 읽은 것에 감사드립니다. –

4

이 시도 줘

DECLARE @bCond BIT 
SET @bCond = 1 

SELECT t1.*, t2.* 
FROM t1 OUTER APPLY 
      (
       SELECT TOP 1 * 
       FROM 
        (
         SELECT *, 'a' src FROM tb10 
         UNION ALL 
         SELECT *, 'b' src FROM tb11 
        )s 
       WHERE src = CASE WHEN @bCond = 0 THEN 'a' ELSE 'b' END 
      ) t2 
+0

JW에게 감사드립니다. 아주 좋은 aproach. 내가 뭘 하려는지 나는 분명하지 않다는 것을 깨달았다. 큰 테이블에서 필드를 가져올 필요가 없을 때 값 비싼 쿼리가 실행되는 것을 피하려고했습니다. 내 편집 된 질문을 참조하십시오. – mmmmmm