当前位置:Gxlcms > 数据库问题 > Merge Into 语句代替Insert/Update在Oracle中的应用实战

Merge Into 语句代替Insert/Update在Oracle中的应用实战

时间:2021-07-01 10:21:17 帮助过:11人阅读

都跟alias1进行 ON (join condition)的比较,如果匹配,就进行更新的操作(Update),如果不匹配,就进行插入操作(Insert)。

因此,严格意义上讲,”在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。”

以上这句话也就很好的解释了在上面写的语句为何只能进行Update,而不能进行Insert了,因为都Select不到数据,如何能进行Insert呢:)

接下来要改成正确的语句就容易多了,如下:

技术分享图片MERGE INTO T T1
技术分享图片USING (SELECT ‘1001‘ AS a,2 AS b FROM dual) T2
技术分享图片ON ( T1.a=T2.a)
技术分享图片WHEN MATCHED THEN
技术分享图片  UPDATE SET T1.b = T2.b
技术分享图片WHEN NOT MATCHED THEN 
技术分享图片  INSERT (a,b) VALUES(T2.a,T2.b);

查询结果,OK!

注意:

如果不懂Merge语句的原理,Merge语句是一条比较危险的语句,特别是在您只想更新一条记录的时候,因为不经意间,你可能就把整表的数据都Update了一遍.....汗!!!

我曾经犯过的一个错误如下所示,大家看出来是什么问题了吗?

技术分享图片MERGE INTO T T1
技术分享图片USING (SELECT Count(*) cnt FROM T WHERE T.a=‘1001‘) T2
技术分享图片ON (T2.cnt>0)
技术分享图片WHEN MATCHED THEN
技术分享图片  UPDATE SET T1.b = T2.b
技术分享图片WHEN NOT MATCHED THEN 
技术分享图片  INSERT (a,b) VALUES(T2.a,T2.b);

 

Merge Into 语句代替Insert/Update在Oracle中的应用实战

标签:如何   body   cond   直接   是什么   acl   逻辑   常用   blog   

人气教程排行