2016-09-29 32 views
1

次のクエリを実行すると、結果が表示されないことがわかっていますが、結果から除外された行があります。私が参加することを削除し、別名「W」によって参照される列は、私はすべてを取得する場合
LEFT OUTERは= B.WP

W.CODE ON BDNDETL WのJOIN:私は参加5日にそれを絞り込みます私が期待している行W.CODE = B.WPに基づいてBに一致する行がないWがありますが、LEFT OUTER条件がこれらをキャッチすると思っていましたが、そうではありません。 INNER JOINのように扱うようです。外部結合行を除外する

SELECT 
    p.p2 AS "Section", 
    d.d9 AS "Alt WBS", 
    p.p3 AS "Year", 
    B.ca1 AS "WBS", 
    concat(b.ca1,'/',b.ca2,'/',b.wp,b.descrip) AS "Work Package", 
    B.WP, 
    w.d9 AS "Cost Category", 
    B.C3 AS "Provider", 
    b.c1 AS "TType", 
    w.d4 AS "WP GLA Cat", 
    U.COSTSET, 
    CONVERT(varchar, T.PD_FINISH, 101) period, 
    SUM(A.ALLOWANCE1 + A.ALLOWANCE2 + A.ALLOWANCE3 + A.ALLOWANCE4 + A.ALLOWANCE5 + A.BASIC + A.BONUS + A.COMMODITY + A.DIRECT + A.ENHANCED + A.NIERS + A.OVERTIME + A.PENSION + A.PILON + A.REDUNDANCY) Value 
FROM 
    TPHASE A JOIN CAWP B ON 
     B.PROGRAM = A.PROGRAM AND B.CAWPID = A.CAWPID 
      JOIN MULTPROG X ON 
       A.PROGRAM = X.SUBPROGRAM 
      JOIN PROGRAM P ON 
       A.PROGRAM = P.PROGRAM 
      JOIN BDNDETL D ON 
       D.CODE = B.CA1 
      LEFT OUTER JOIN BDNDETL W ON 
       W.CODE = B.WP 
      JOIN COSTDETL U ON 
       A.CLASS = U.CLASS 
      JOIN RCUTOFF T ON 
       A.DF_DATE BETWEEN T.PD_START AND T.PD_FINISH 
WHERE 
    X.MASTER = @master AND 
    D.BREAKFILE = @wbsfile AND 
    U.INSTANCE = @costdetlid AND 
    T.INSTANCE = @cutoffid AND 
    W.BREAKFILE = @wpbdn 
GROUP BY 
    p.p2, 
    d.d9, 
    p.p3, 
    B.ca1, 
    concat(b.ca1,'/',b.ca2,'/',b.wp,b.descrip), 
    B.WP, 
    w.d9, 
    B.C3, 
    b.c1, 
    w.d4, 
    U.COSTSET, 
    T.PD_FINISH 
; 
+2

問題はwhere条件にあります。W.BREAKFILE = @ wpbdn;これを左結合のオン条件に含めます[左外部結合BDNDETL W ON W.CODE = B.WP AND W.BREAKFILE = @ wpbdn –

答えて

3

WHERE句でこの条件:一致がないとき

W.BREAKFILE = @wpbdn 

が失敗しました。どうして? W.BREAKFILENULLです。適切なON句に移動する必要があります。

 LEFT OUTER JOIN BDNDETL W ON 
      W.CODE = B.WP AND W.BREAKFILE = @wpbdn 

そして、アドバイスの一部です。これは従って、ロジックがはるかに容易になり

FROM TPHASE A JOIN 
    CAWP B 
    ON B.PROGRAM = A.PROGRAM AND B.CAWPID = A.CAWPID JOIN 
    MULTPROG X 
    ON A.PROGRAM = X.SUBPROGRAM JOIN 
    PROGRAM P 
    ON A.PROGRAM = P.PROGRAM JOIN 
    BDNDETL D 
    ON D.CODE = B.CA1 JOIN 
    COSTDETL U 
    ON A.CLASS = U.CLASS JOIN 
    RCUTOFF T 
    ON A.DF_DATE BETWEEN T.PD_START AND T.PD_FINISH LEFT JOIN 
    BDNDETL W 
    ON W.CODE = B.WP 

:あなたはinnerleft合流を混合している場合、私は強くあなたがすべての内部は最初left join Sに続いてのジョイン置くことをお勧めします。その考え方は、内側の結合がフィルタリングを行い、次に左側の結合で「これらの行をすべて保持して、これらの追加の列が一致する場合は追加する」ということです。

3

where句にW.BREAKFILE = @wpbdnがある場合、左結合のnull値はこのフィルタを通過できません。

関連する問題