oracle-多表关联更新

将一个表a的字段aField更新到另一个表b的字段bField上,
两个表通过 a.b_id = b.id 关联

单表更新

UPDATE STUDENTS
SET    
       EMPLOYEE_ID_FK       = '3789'  ,
       GENDER_CODE          = 'F'  ,
       MARITAL_STATUS_CODE  = 'M'  
WHERE  STUDENT_ID = 11

多表更新

-- 方法1.
UPDATE  表2
SET
    表2.C  = ( SELECT  B  FROM  表1  WHERE   表1.A = 表2.A )
WHERE
    EXISTS ( SELECT 1 FROM   表1  WHERE   表1.A = 表2.A )
  
-- 方法2
MERGE INTO 表2 
USING 表1
ON ( 表2.A = 表1.A )    -- 条件是 A 相同
WHEN MATCHED THEN UPDATE SET 表2.C = 表1.B   -- 匹配的时候,更新

多表更新 项目例子

将 budet_project 表中 begin_time 的 年份 更新到 budget_project_detail 表中 的 budget_set_str

注: oracle 多表更新时 不支持 内联操作 left join

-- 20170806:将活动主单 begin_time 的年份 更新到 子单的 budget_set_str
update BUDGET_PROJCET_DETAIL bpd
set bpd.budget_set_str = (
    -- 此处 begin_time 是 date 类型字段,需要 用 to_char 转出 字符
    -- 或 substr(to_char(bp.begin_time,'yyyy-mm-dd,hh24:mi:ss'),0,4) --将开始时间转成字符串 再对字符串进行截取
    select to_char(bp.begin_time,'yyyy') from budget_project bp 
    where bpd.budget_project_id = bp.id
    )
-- 需要加上下面这个 exists 判断,否则 上部分sql执行的结果数量 大于 全部sql执行的结果数量
where exists (
    select 1 from  budget_project bp
    where bpd.budget_project_id = bp.id
)
;