Как преобразовать запрос на выборку внешнего соединения в MERGE в Oracle - PullRequest
0 голосов
/ 19 ноября 2018

Как я могу преобразовать это простое Внешнее Соединение в MERGE, чтобы обновить FT.SS до определенного значения для выбранных строк:

SELECT FT.SS FROM FT_T FT LEFT OUTER JOIN DC_T DC
    ON FT.ID = DC.ID AND FT.CN = DC.CN
WHERE FT.GID = 'AB' AND SS = 'C' AND FT.DEL = 'N' AND PR_S IS NULL AND EN_S IS NULL
AND (DC.ID IS NULL OR DC.SIGNED IS NULL); 

Это относительно легко сделать с UPDATE:

UPDATE FT_T FTX
SET FTX.SS = 'X'
WHERE FT.GID = 'AB' AND SS = 'C' AND FT.DEL = 'N' 
    AND PR_S IS NULL AND EN_S IS NULL 
    AND (FTX.ID, FTX.CN) = (
       SELECT FT.ID, FT.CN FROM FT_T FT LEFT OUTER JOIN DC_T DC
           ON FT.ID = DC.ID AND FT.CN = DC.CN
       WHERE FT.GID = 'AB' AND SS = 'C' AND FT.DEL = 'N' AND PR_S IS NULL AND EN_S IS NULL 
         AND (DC.ID IS NULL OR DC.SIGNED IS NULL)
)

Но можно ли это сделать с MERGE?

1 Ответ

0 голосов
/ 19 ноября 2018

Ваше заявление о слиянии будет выглядеть так:

MERGE INTO ft_t tgt
USING (SELECT ft.id,
              ft.cn
       FROM   ft_t ft
              LEFT OUTER JOIN dc_t dc ON ft.id = dc.id AND ft.cn = dc.cn
       WHERE  ft.gid = 'AB'
       AND    ft.ss = 'C'
       AND    ft.del = 'N'
       AND    ft.pr_s IS NULL
       AND    ft.en_s IS NULL
       AND    (dc.id IS NULL OR dc.signed IS NULL)) src
 ON (tgt.id = src.id AND tgt.cn = src.cn) -- assuming these two columns are the primary key for the ft_t table
WHEN MATCHED THEN
  UPDATE SET tgt.ss = 'X';
...