连接 - 在两个表上使用过滤器进行左连接,如果不匹配则返回零

时间:2013-07-09 13:19:06

标签: sql tsql join ssms

我正在尝试计算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)

我希望返回sb(a)中的所有记录,其中Current Stock = 1。 我希望返回来自ile(b)的所有匹配记录,其中Open = 1。

问题是,如果没有匹配的记录,我仍然希望返回sb(a)字段,并将b.Amount设置为0.

有多个记录,其中b.Open = 0,不得返回。

我该如何解决这个问题?我看到了一个涉及COALESCE的解决方案,但我无法正常工作

谢谢

2 个答案:

答案 0 :(得分:1)

既然你想要A,不要在你的where子句中包含任何硬条件。对于与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)

然后你可以在SELECT子句中使用ISNULL或COALESCE来强制b.amount在B不匹配时为0。

答案 1 :(得分: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)