2016-08-11 3 views
1

일부 조인이 포함 된 쿼리가 있습니다. 조인 중 하나는 다른 값에 따라 달라집니다. WHERE 절에 SQL Server CASE WHEN

내 쿼리입니다 :

SELECT * 
FROM CLIIRE A 
LEFT JOIN CLIIOR B ON A.PTA = B.PTA AND A.ORD = B.ORD AND A.ITE = B.ITE 
LEFT JOIN CLIORD C ON C.PTA = B.PTA AND C.ORD = B.ORD 
LEFT JOIN CLIPAC D ON C.OPA = D.ORI AND C.PAC = D.PAC 
LEFT JOIN CLIREN E ON E.NRE = A.NRE AND D.INS = E.INS AND A.CPT = E.CPT 
LEFT JOIN 
    (SELECT * 
    FROM CLINOM 
    WHERE CLA = (CASE WHEN B.PFA = '88882' THEN 'MD' ELSE 'BU' END)) AS N ON B.PFA = N.COD 
LEFT JOIN 
    (SELECT * 
    FROM CLIMED WHERE PRE = '') AS M ON B.PFA = M.MED 
LEFT JOIN CLIPRF P ON B.PRF = P.PRF 
WHERE 
    (D.INS LIKE 'OM%' OR D.INS LIKE 'SOL%') 
    AND E.NFA IN ('5188') 
    AND A.CPT IN ('fi', 'pi') 
ORDER BY 
    E.NFA 

하지만 라인에서 오류가 발생 해요 :

LEFT JOIN (SELECT * FROM CLINOM WHERE CLA = (CASE WHEN B.PFA = '88882' THEN 'MD' ELSE 'BU' END)) AS N ON B.PFA=N.COD 

는 SQL 서버처럼 보이는

나를 그렇게하도록 허용하지 않습니다 :

다중 부품 식별자 "B.PFA"를 바인딩 할 수 없습니다.

B.PFA 컬럼이 존재합니다.

아무도 도와 줄 수 있습니까? 감사 !

+0

LEFT JOIN을하면 문제가 있습니다. OUTER APPLY로 변경하면 B.PFA가 존재하는 한 B.PFA를 하위 쿼리에 보낼 수 있습니다. - B.PFA = N.COD가 들어가면 하위 쿼리 – Cato

답변

2

문제는 외부 쿼리 참조를 하위 쿼리에서 사용할 수 없다는 것입니다. 행복하게, 하위 쿼리는 필요하지 않습니다. 이 논리를 사용해보십시오.

LEFT JOIN CLINOM N 
ON P.FA = N.COD AND 
    N.CLA = (CASE WHEN B.PFA = '88882' THEN 'MD' ELSE 'BU' END) 

CASE없이 이것을 사용할 수 있습니다. B.PFA를 가정하지 NULL입니다 : NULL

LEFT JOIN CLINOM N 
ON P.FA = N.COD AND 
    ((N.CLA = 'MD' AND B.PFA = '88882') OR 
    (N.CLA = 'BU' AND B.PFA <> '88882') 
    ) 

B.PFA 경우 : 만약 당신이 좋아하면

LEFT JOIN CLINOM N 
ON P.FA = N.COD AND 
    ((N.CLA = 'MD' AND B.PFA = '88882') OR 
    (N.CLA = 'BU' AND (B.PFA <> '88882' OR B.PFS IS NULL)) 
    ) 

또한 COALESCE()를 사용할 수 있습니다.

+0

에서 WHERE는 정확히 내가 필요한 것입니다. 감사합니다 !!! –

+0

@Gordon Linoff, null 값을 갖는 B.PFA 인 경우 IsNull (B.PFA, '') = ''을 사용해야합니다. 맞습니까? – RGS