Iseries

我需要相同的行來合併

  • February 6, 2022

上一個問題:如果不符合條件,則返回帶有值的行

我幾乎得到了這個工作。我遇到的問題是,如果它們相同,則此查詢變體不會將 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 代替缺失的行 ‘VALPROSUM。像這樣:

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.GESUPDFGE50LM0TV.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與 不匹配SVINVDCNFLIG = '2'將完全從輸出中排除該行,這與您要實現的目標相反。但是,在該ON子句中,條件將GESUPD僅適用於,並且SVINVD仍將返回不匹配的行。

雖然通常看起來比其他LEFT JOIN解決方案更簡單,但此選項可能不一定那麼快。您將必須測試兩者以比較自己的性能。自然,這適用於所有三個選項。

引用自:https://dba.stackexchange.com/questions/296277