2013-07-09 40 views
1

我試圖計算2個相關表上的2個值之間的差異。加入 - 在兩個表上使用過濾器的左連接,如果不匹配則返回零

SELECT  a.[Batch No_], b.[Lot No_], b.[Open], a.[Current Stock], b.Amount, a.[Batch Value] 
    FROM   [sb] AS a LEFT OUTER JOIN 
        [ile] AS b ON a.[Batch No_] = b.[Lot No_] 
    WHERE  (a.[Current Stock] = 1) AND (b.[Open] = 1) 

我想從某人的所有記錄的(a)將被返回,其中現有存貨= 1 我想從ILE(b)所有匹配的記錄將被返回,其中開放式= 1

問題是,如果沒有匹配的記錄,我仍然希望返回sb(a)字段,並將b.Amount設置爲0.

有多個記錄,其中b.Open = 0,被退回。

我該如何解決這個問題?我看到涉及COALESCE一個解決方案,但我不能讓它工作

感謝

+0

無論何時將'WHERE'條件放在'B'表中的任何列上,您都有效地將您的'LEFT JOIN'變爲'INNER'。您需要將這些條件移至「ON」子句,如下面的答案所示。 –

回答

1

既然你想不管是什麼,不包括你的where子句中第B任何硬性條件。對於不與A匹配的行,B的所有列都將爲NULL。將這些條件移動到JOIN。就像這樣:

SELECT  a.[Batch No_], 
       b.[Lot No_], 
       b.[Open], 
       a.[Current Stock], 
       isnull(b.Amount,0) 
       a.[Batch Value] 
FROM   [sb] AS a LEFT OUTER JOIN 
       [ile] AS b ON a.[Batch No_] = b.[Lot No_] 
       and 1 = b.[Open] 
WHERE  (a.[Current Stock] = 1) 

然後你可以使用ISNULL或COALESCE你的SELECT子句中強制b.amount爲0時,不匹配B中。

+0

這很好。 感謝您的解釋,這是最有幫助的 – user2401849

0

將過濾謂詞放入連接條件子句中。

SELECT a.[Batch No_], b.[Lot No_], b.Open, 
    a.[Current Stock], isNull(b.Amount, 0) Amount, 
    a.[Batch Value] 
FROM sb a 
    LEFT JOIN ile b 
    ON a.Batch No_ = b.[Lot No_] 
     And a.[Current Stock] = 1 
     And b.Open = 1) 
相關問題