簡體   English   中英

外部聯接(不包括行)

[英]Outer Join Excluding Rows

當我運行以下查詢時,盡管知道它們應該在其中,但仍有一些行被排除在結果之外。 我將范圍縮小到第5個聯接:
左外連接BDNDETL W ON
W.CODE = B.WP
如果刪除該連接和別名“ W”所引用的列,則將獲得所有期望的行。 W中有些行基於W.CODE = B.WP在B中沒有匹配項,但我認為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
;

如果where子句中有W.BREAKFILE = @wpbdn ,則左連接的空值無法通過此過濾器。

WHERE子句中的此條件:

    W.BREAKFILE = @wpbdn

沒有匹配項時失敗。 為什么? 因為W.BREAKFILENULL 您應該將其移至適當的ON子句:

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

並且,一條建議。 當您混合inner聯接和left聯接時,強烈建議您將所有內部聯接放在首位,然后是left join聯接s:

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

這使得邏輯更容易遵循。 這個想法是內部聯接執行過濾,然后左聯接說“保留所有這些行,並在匹配時添加這些其他列”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM