Merge Into 不能执行Insert的原因

语法:

 

MERGE INTO  [your table-name] [rename your table here]

USING  ( [write your query here] )[rename your query-sql and using just like a table]

ON  ([conditional expression here] AND [...]...)

WHEN MATHED THEN [here you can execute some update sql or something else ]

WHEN NOT MATHED THEN [execute something else here ! ]
 

这个语句在处理具有主从关系的表时没丝毫问题。我以前用的时候都是多表操作。我今天实现在一个表里面Merge into时却出了问题,研究了好久,终于搞定。

 

错误的sql语句:

merge  into XJ_BK_FZY_TIMESET


  a

 using (select zxnj from XJ_BK_FZY_TIMESET



 where zxnj = '2006') b on (b.zxnj='2006')

  when matched then update set a.endtime = '20100519'  where a.zxnj = '2004' 

   when not matched then insert(a.zxnj, a.endtime) values('2006', '20100519') 

 注: XJ_BK_FZY_TIMESET(学籍_本科_分专业_时间设置):表中只有两个字段:zxnj:在学年级,endTime:截止时间。

 

这个sql的目的是XJ_BK_FZY_TIMESET表中存在zxnj=2006的数据时,执行update操作,否则执行insert操作。

这个sql从语法上是没错的而且程序是能够执行的

 

XJ_BK_FZY_TIMESET现在没有数据,执行上面的sql后,仍没有数据。手工插入一条zxnj=2006的数据后这条sql却能执行update操作。

 

错误原因:

 Merge Into执行时,会从using 搜出来的结果逐条与 on条件匹配,然后决定是update还是Insert。

所以using后面的sql没有查询到数据这个Merge Into语句是不会执行update和Insert操作的。

 

 

单表操作时建议写成两个SQL

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值