使用 MERGE 语句 INSERT 不进去的一个例子



今天朋友给我看一个 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值