今天朋友给我看一个 SQL ,一个 MERGE 语句。
看SQL,他的本意好像是,有一堆变量,一个表里有就更新,没有就插入。
SQL 文本如下;
MERGE INTO HI_SMPL T1
USING (SELECT VBLEN, POSNR
FROM HI_SMPL
WHERE VBLEN = 'VBELN00001'
AND POSNR = 'PO0001') T2
ON (T2.VBLEN = T1.VBLEN AND T2.POSNR = T1.POSNR)
WHEN MATCHED THEN
UPDATE
SET MATNR = 'LS22A13WX/XTL',
SPART = 'CTV',
ZMENG = '4',
SHOPCD = 'CS0000164',
DISP_DATE_F = '20160818',
LAST_MOD_DT = SYSDATE,
LAST_MOD_ID = 'IF'
WHEN NOT MATCHED THEN
INSERT
(VBLEN,
POSNR,
MATNR,
SPART,
ZMENG,
SHOPCD,
DISP_DATE_F,
REGI_DT,
REGI_ID,
DC_SMPL_APLY_ST)
VALUES
('VBELN00001',
'PO0001',
'LS22A13WX/XTL',
'CTV',
'4',
'CS0000164',
'20160818',
SYSDATE,
'IF',
'');
我让他用下面查一下,看看有没有结果。
select *
from MCS_HQ.HI_GERP_DC_SMPL T1
,(SELECT VBLEN, POSNR
FROM HI_SMPL
WHERE VBLEN = 'VBELN00001'
AND POSNR = 'PO0001') T2
where T2.VBLEN = T1.VBLEN AND T2.POSNR = T1.POSNR;
没有结果集, 但是没有插入。
再一看,
(SELECT VBLEN, POSNR
FROM HI_SMPL
WHERE VBLEN = 'VBELN00001'
AND POSNR = 'PO0001') T2
这个就是空集,跟空集关联,当然没有结果了。
MERGE 里 WHEN NOT MATCHED THEN 的意识,不是没有结果集就肯定执行。
是两个非空集合,关联以后没有结果集才执行。
建议 SQL 改成如下,应该就好了。
MERGE INTO HI_SMPL T1
USING ( SELECT 'VBELN00001' VBLEN, 'PO0001' POSNR
FROM dual ) T2
ON (T2.VBLEN = T1.VBLEN AND T2.POSNR = T1.POSNR)
WHEN MATCHED THEN
UPDATE
SET MATNR = 'LS22A13WX/XTL',
SPART = 'CTV',
ZMENG = '4',
SHOPCD = 'CS0000164',
DISP_DATE_F = '20160818',
LAST_MOD_DT = SYSDATE,
LAST_MOD_ID = 'IF'
WHEN NOT MATCHED THEN
INSERT
(VBLEN,
POSNR,
MATNR,
SPART,
ZMENG,
SHOPCD,
DISP_DATE_F,
REGI_DT,
REGI_ID,
DC_SMPL_APLY_ST)
VALUES
('VBELN00001',
'PO0001',
'LS22A13WX/XTL',
'CTV',
'4',
'CS0000164',
'20160818',
SYSDATE,
'IF',
'');
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13696961/viewspace-2123664/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13696961/viewspace-2123664/