2016-08-11 18 views
1

Ich habe eine Abfrage mit einigen Joins. Einer der Joins hängt von einem anderen Wert ab.SQL Server CASE WHEN in WHERE-Klausel

Dies ist meine Frage:

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 

Aber ich bin immer Fehler in der Zeile:

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

wie SQL Server Sieht mir nicht zulassen, dass tun:

Die mehrteilige Kennung "B.PFA" konnte nicht gebunden werden

Die Spalte B.PFA existiert.

Kann mir jemand helfen? Vielen Dank !

+0

der LINKE JOIN, mit dem Sie Probleme haben, ändern Sie es in OUTER APPLY, dann kann es B.PFA in die Unterabfrage senden, solange B.PFA existiert - ON B.PFA = N.COD würde gehen die WHERE in der Unterabfrage – Cato

Antwort

2

Das Problem besteht darin, dass der äußere Abfrageverweis in der Unterabfrage nicht verfügbar ist. Zum Glück, obwohl die Unterabfrage nicht benötigt wird. Versuchen Sie, diese Logik:

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

Und Sie können diesen Satz ohne CASE. Unter der Annahme, B.PFA ist nicht 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') 
    ) 

Wenn B.PFANULL sein könnte:

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)) 
    ) 

Sie auch COALESCE() verwenden können, wenn Sie mögen.

+0

Das war genau das, was ich brauchte. Danke !!! –

+0

@Gordon Linoff, wenn B.PFA einen Nullwert hat, dann sollten wir IsNull (B.PFA, '') = '' verwenden. Ist es richtig? – RGS