假设有两个表A和B,A表字段a,b,c,d,B表字段b,e,f,两表的关联条件是字段b,现在想做个data patch,欲将B表中的字段e的值patch给A表的字段c.

有如下两种方法:

1

update A set A.c=(select e from B where B.b=A.b)
where exists(select 1 from B where B.b=A.b);

2

merge into A
using B
on (A.b=B.b)
when matched then update set A.c=B.e;

上面两种方法都可以实现多表联结的更新,其中的B表也可以是子查询,视图。

merge into是oracle 9i之后添加的语法,可以实现update/insert的功能(满足条件更新,不满足条件插入),而且效率要高,因为用merge只需要一次全表扫描,但merge into的使用需要小心,必须理解它的用法才能放心使用,否则有可能出现问题。

上面的例子不仅仅可以更新单个字段,也可以更新多个字段,如下:

1

update A set A.c=(select e from B where B.b=A.b),
A.d=(select f from B where B.b=A.b)
where exists(select 1 from B where B.b=A.b);

2

merge into A
using B
on (A.b=B.b)
when matched then update set A.c=B.e,
A.d=B.f;

还有更复杂的情况,多个字段的更新来自于不同的表,比如A表的d字段来源于C表的某个字段,个人觉得这种情况不需要写在一个sql文中,分成两个sql文就行。

在网上看到这么一句话,”在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数”。个人觉得并不对,这个结论的前提应该是源表和目标表之间关联的字段都是唯一约束的,在我的例子中,B表的b字段作为主键,而A表的b字段可以重复,如果说B表的数据有4条,A表中对应B表的每条记录都有两条数据,那么实际上更新的记录数为8条,更不谈再加上not matche的 insert语句了。

各位如果有什么觉得不对的,麻烦指出来,谢谢喽。

最新文章

  1. CSS3文本溢出显示省略号
  2. IntelliJ IDEA 配置运行程序
  3. org.springframework.beans.MutablePropertyValues.add
  4. Windows平台下PHP环境搭建
  5. fw: webdriver 那些坑
  6. PS 使用首记 修改png图片的颜色
  7. [转]nodejs npm常用命令
  8. ListView优化-通用ViewHolder编写备份
  9. Java中成员变量和局部变量的区别
  10. Windows Internals学习笔记(二)系统架构
  11. MySQL 通过mysql_config_editor更安全的登录数据库
  12. WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
  13. 使用Linux 安装MySQL
  14. 【转载】小结一下linux 2.6内核的四种IO调度算法
  15. Servlet的三个域对象
  16. 使用 WTForms 进行表单验证的例子
  17. 面试必备:ArrayList源码解析(JDK8)
  18. opencv+python 自动绿帽机
  19. 如何在Python中使用ZeroMQ和Docker构建微服务架构
  20. 初识React:使用React完成Hello World程序

热门文章

  1. Word2013 在一个页面双列显示
  2. Winform禁止程序多开 &&禁止多开且第二次激活第一次窗口
  3. PostgreSQL 务实应用(三/5)分表复制
  4. 程序兵法:Java String 源码的排序算法(一)
  5. 解决MySql报错:1130 - Host 'xxx' is not allowed to connect to this MySQL server的方法
  6. opengl VAO ,VBO
  7. 3DMAX 烘培技术
  8. 新手安装 hadoop、hive和hbase 笔记
  9. C 语言实例 - 将字符串写入文件
  10. JDBC | 查询表数据行数