假设有两个表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语句了。

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

PL/SQL 多表关联UPDATE的更多相关文章

  1. sql -- 多表关联,update(用户奖励)

    表设计: users_buy: users_score: 需求: 1.根据用户分组,找出用户消费最高的金额 select user_name, max(paymoney) as pm from use ...

  2. Oracle中如何实现Mysql的两表关联update操作

    在看<MySQL 5.1参考手册>的时候,发现MySQL提供了一种两表关联update操作.原文如下: UPDATE items,month SET items.price=month.p ...

  3. ORACLE多表关联UPDATE 语句

    转载至:http://blog.itpub.net/29378313/viewspace-1064069/ 为了方便起见,建立了以下简单模型,和构造了部分测试数据:在某个业务受理子系统BSS中, SQ ...

  4. ORACLE 多表关联 UPDATE 语句

    为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create table customers ( customer_id num ...

  5. ORACLE多表关联UPDATE 语句[z]

    [z]https://www.cnblogs.com/franson-2016/p/5988303.html 1) 最简单的形式 SQL 代码 --经确认customers表中所有customer_i ...

  6. 图解SQL多表关联查询

      图解SQL多表关联查询     网上看了篇文章关于多表连接的,感觉很好,记录下来,以便日后自己学习  内连接     左连接     右连接       全外连接   1. 查两表关联列相等的数据 ...

  7. sql server多表关联update

    一般都是写的单表update语句,很少写多表关联的update,但是事实上,在SQL Server中,update的多表连接更新和select的多表连接查询在使用的方法上其实并没有多大区别. 直接上一 ...

  8. sqlite多表关联update

    sqlite数据库的update多表关联更新语句,和其他数据库有点小不一样 比如:在sql server中: 用table1的 id 和 table2的 pid,关联table1 和 table2 , ...

  9. PL/SQL 嵌套表变长数组和索引表[转]

    关于PL/SQL中这三种数组的介绍,不想写了.转一篇日志吧…… 链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html ...

随机推荐

  1. Spring 事务管理高级应用难点剖析: 第 3 部分

    本文是“Spring 事务管理高级应用难点剖析” 系列文章的第 3 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括在使用 Spring JDBC 时如果直接获取 ...

  2. bzoj 3745 [Coci2015]Norma——序列分治

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3745 如果分治,就能在本层仅算过 mid 的区间了. 可以从中间到左边地遍历左边,给右边两个 ...

  3. PHP 单引号与双引号的区别 SQL中的使用

    php单引号与双引号用法:引号嵌套方法 1.双引号内不能直接就再嵌套双引号 2.双引号与单引号互相嵌套使用 如: 双引号内直接嵌套单引号 echo "<script language= ...

  4. HDU2159(完全背包)

    FATE Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description ...

  5. tty初探 — uart驱动框架分析

    写在前面: 我们没有讲UART驱动,不过我们认为,只要系统学习了第2期,应该具备分析UART驱动的能力,小编做答疑几年以来,陆陆续续有不少人问到UART驱动怎么写,所以今天就分享一篇深度长文(1700 ...

  6. py-day1简单使用方法及语法使用详解

    一.python入门 1.python的标准格式 创建python文件以.py结尾 如:vi hello.py #!/usr/bin/env python #-*- coding:utf-8 -*- ...

  7. 【旧文章搬运】加载PE文件时IAT的填充时机

    原文发表于百度空间,2011-06-20========================================================================== 大致过程如 ...

  8. EF之贪婪加载和延迟加载

    这篇文章将讨论查询结果的控制 在使用EF(Entity Framework)的过程中,很多时候我们会进行查询的操作,因此知道哪些数据会被加载到内存当中就至关重要.在多多的情况下,你可能并并不需要加载全 ...

  9. mongodb "$"的作用

    { "_id": ObjectId("58e48e32830f398e8f401a95"), "_class": "com.ydd ...

  10. Lua 5.1.1 源代码阅读笔记

    http://blog.csdn.net/hamenny/article/details/4506130