上一个问题:如果不符合条件,则返回带有值的行
我几乎得到了这个工作。我遇到的问题是,如果它们相同,则此查询变体不会将 SELECT 中的行与 UNION 中的行合并:
SELECT CODPRO, VALPRO, COALESCE(SUM(UVCLIV), 0) AS SUM
FROM FGE50LM0TV.GESUPD
WHERE CNFLIG = '2'
AND CODPRO IN (SELECT VALINV FROM FGE50LM0TV.SVINVD WHERE NUMINV = 59)
GROUP BY CODACT, CODPRO, VALPRO
UNION (SELECT VALINV, 0, 0 FROM FGE50LM0TV.SVINVD WHERE NUMINV = 59) ;
这就是 SVINVD 的样子:
这就是 GESUPD 的样子:
这里没有“PRODUIT5”行。
因此,我得到一条双线:
UNION
运算符消除重复行。这意味着只有完全相同的两行才会合并。排不会与行合并
因为最后一列中的值不同。
无论如何,如果目标是完成返回的集合
在中发现缺失值
那么有一些方法可以解决这个问题。
1.
UNION
+EXCEPT
这里有一些重复的逻辑,比如
CNFLIG = '2'
- 如果可能的话,我个人更喜欢在我的查询中避免这个方面。除此之外,这对我来说似乎或多或少是直截了当的方法。2.
LEFT JOIN
将您的查询用作派生表并将其外连接到
FGE50LM0TV.SVINVD
. 用 0 代替缺失的行 'VALPRO
和SUM
。像这样:3.
LEFT JOIN
、备选方案您也可以直接尝试外连接
FGE50LM0TV.GESUPD
,FGE50LM0TV.SVINVD
然后应用分组:请注意,
CNFLIG = '2'
从WHERE
移到ON
子句。这是为了避免消除不匹配的GESUPD
条目。该WHERE
子句适用于整个连接集,并且 whereGESUPD
与 不匹配SVINVD
,CNFLIG = '2'
将完全从输出中排除该行,这与您要实现的目标相反。但是,在该ON
子句中,条件将GESUPD
仅适用于,并且SVINVD
仍将返回不匹配的行。虽然通常看起来比其他
LEFT JOIN
解决方案更简单,但此选项可能不一定那么快。您将必须测试两者以比较自己的性能。自然,这适用于所有三个选项。