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)

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

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

b.Open = 0 的记录有多个,不能返回。

我该怎么做?我看到了一个涉及 COALESCE 的解决方案,但我无法让它工作

谢谢

4

2 回答 2

1

因为无论如何你都想要 A,所以不要在你的 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)

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

于 2013-07-09T13:21:54.933 回答
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)
于 2013-07-09T13:24:04.963 回答