Iseries
我需要相同的行來合併
上一個問題:如果不符合條件,則返回帶有值的行
我幾乎得到了這個工作。我遇到的問題是,如果它們相同,則此查詢變體不會將 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
運算符消除重複行。這意味著只有完全相同的兩行才會合併。排不會與行合併
因為最後一列中的值不同。
無論如何,如果目標是完成返回的集合
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)
在中發現缺失值
SELECT VALINV FROM FGE50LM0TV.SVINVD WHERE NUMINV = 59
那麼有一些方法可以解決這個問題。
1.
UNION
+EXCEPT
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) UNION ( SELECT VALINV, 0, 0 FROM FGE50LM0TV.SVINVD WHERE NUMINV = 59 EXCEPT SELECT CODPRO, 0, 0 FROM FGE50LM0TV.GESUPD WHERE CNFLIG = '2' )
這裡有一些重複的邏輯,比如
CNFLIG = '2'
——如果可能的話,我個人更喜歡在我的查詢中避免這個方面。除此之外,這對我來說似乎或多或少是直截了當的方法。2.
LEFT JOIN
將您的查詢用作派生表並將其外連接到
FGE50LM0TV.SVINVD
. 用 0 代替缺失的行 ‘VALPRO
和SUM
。像這樣:SELECT s.VALINV AS CODPRO, COALESCE(g.VALPRO, 0) AS VALPRO, COALESCE(g.SUM, 0) AS SUM FROM FGE50LM0TV.SVINVD AS s LEFT JOIN ( SELECT CODPRO, VALPRO, COALESCE(SUM(UVCLIV), 0) AS SUM FROM FGE50LM0TV.GESUPD WHERE CNFLIG = '2' ) AS g ON s.VALINV = g.CODPRO WHERE s.NUMINV = 59 ;
3.
LEFT JOIN
、備選方案您也可以直接嘗試外連接
FGE50LM0TV.GESUPD
,FGE50LM0TV.SVINVD
然後應用分組:SELECT s.VALINV AS CODPRO, COALESCE(g.VALPRO, 0) AS VALPRO, COALESCE(SUM(g.UVCLIV), 0) AS SUM FROM FGE50LM0TV.SVINVD AS s LEFT JOIN FGE50LM0TV.GESUPD AS g ON s.VALINV = g.CODPRO AND g.CNFLIG = '2' WHERE s.NUMINV = 59 GROUP BY s.VALINV, g.VALPRO ;
請注意,
CNFLIG = '2'
從WHERE
移到ON
子句。這是為了避免消除不匹配的GESUPD
條目。該WHERE
子句適用於整個連接集,並且 whereGESUPD
與 不匹配SVINVD
,CNFLIG = '2'
將完全從輸出中排除該行,這與您要實現的目標相反。但是,在該ON
子句中,條件將GESUPD
僅適用於,並且SVINVD
仍將返回不匹配的行。雖然通常看起來比其他
LEFT JOIN
解決方案更簡單,但此選項可能不一定那麼快。您將必須測試兩者以比較自己的性能。自然,這適用於所有三個選項。