我正在尝试计算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的解决方案,但我无法正常工作
谢谢
答案 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)