2016-08-11 33 views
1

私はいくつかの結合でクエリを持っています。結合の1つは別の値に依存します。WHERE句のSQL Serverのケース

これは私のクエリです:

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 

しかし、私はラインでのエラーを取得しています:SQL Serverは、私はそれを行うことを許可しませんように

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

はルックス:

複数パート識別子「B.PFA」はバインドできませんでした

カラムB.PFAが存在します。

誰でも手伝ってもらえますか?ありがとう!

+0

LEFT JOINで問題が発生している場合は、OUTER APPLYに変更します。B.PFAが存在する限り、B.PFAをサブクエリに送信できます。-B.PFA = N.CODに入るサブクエリのWHERE – 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を付けずにこのフレーズを試すことができます。

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.PFANULLすることができれば:B.PFANULLではないと仮定すると、

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

これはまさに私が必要としていたものでした。 ありがとうございます! –

+0

@Gordon Linoff、null値を持つB.PFAの場合は、IsNull(B.PFA、 '')= ''を使用する必要があります。それが正しいか? – RGS