语法:
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