暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

关于一次update改写merge into的改写

原创 杜伟 2024-03-28
524

在之前的文章中已经介绍过update类的标量子查询改写方法

https://www.modb.pro/db/1721422485592809472

对于常规类型的改写就按上面的方式即可,注意对被更新的表在update方式时,是否需要被更新为空的逻辑


今天遇到的例子是这样的:a的empno更新成b的ID,两表关联条件也是a.empno=b.empno,对于这样的更新关联条件的话merge into方式是不支持的。

update dw0328 a set a.empno=(select b.id from dw0328a b where a.empno=b.empno) where exists (select 1 from dw0328a b where a.empno=b.empno);


我们先准备测试表

select * from dw0328;


select * from dw0328a ;



如果按之前介绍的改写方式就会报错,关联字段不能被更新的。这次我们换个方式:

merge into dw0328 a
using (select a.id, b.id x from dw0328 a, dw0328a b where a.empno = b.empno) b
on (a.id = b.id)
when matched then
  update set a.empno = b.x;

 经分析,B表的关联条件此时务必是不能重复的,不然 a.empno会对应多个值而更新报错的。此时我们利用a表的唯一性字段,或者rowid通过关联字段跟b表关联,关联出唯一性字段与被更新字段,再次与a表匹配更新,达到改写要求!


-----分割线

之前提到过update这种方式有时候会更新为空值的,所以在写sql及改写的时候都需要注意,下面这两个写法是等价的

update dw0327 a set a.empno=(select b.empno from dw0327a b where a.id=b.id) where exists(select 1 from dw0327a b where a.id=b.id) ;

merge into dw0327 a using dw0327a b on (a.id=b.id) when matched then update set a.empno=b.empno;


但是下面这样的就不是等价的,update方式可能会因a.id=b.id不满足时,将a.empno更新为空,此处是要注意的,在改写的时候还是建议用select的方式查询下

update dw0327 a set a.empno=(select b.empno from dw0327a b where a.id=b.id)  ;

merge into dw0327 a using dw0327a b on (a.id=b.id) when matched then update set a.empno=b.empno;





「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论