将一个表的字段更新到另一个表中去

描述

做一个需求需要记录用户留下签字意见时的职位信息,并且签字意见中留下的职位信息不随他的职位的调动变化而变化。在标准产品的签字意见表里面没有记录职位信息的字段,这就需要我们添加一个字段用于存储当前操作者的职位信息,对于新的数据我们可以在插入签字意见的时候一并插入。但是对于历史数据,我们就需要通过SQL来更新,这样在升级客户系统的时候直接运行一个SQL脚本就将历史数据的职位字段更新为记录的操作者当前的职位信息。
假设表HRM表示用户表,结构如下:

字段名字类型备注
IDNUMBER用户id
NAMEVARCHAR2用户名字
DEPTNUMBER部门id

签字意见表LOG,结构如下:

字段名字类型备注
IDNUMBER签字意见id
USERIDNUMBER用户id
DEPTNUMBER部门id
LOGVARCHAR2签字意见内容

数据库使用的是oracle11g,测试表创建脚本:

CREATE TABLE HRM (
  ID NUMBER NOT NULL ,
  NAME VARCHAR2(255 BYTE) ,
  DEPT NUMBER
)

CREATE TABLE LOG (
  ID NUMBER NOT NULL ,
  USERID NUMBER ,
  DEPT NUMBER ,
  LOG VARCHAR2(255 BYTE)
)

INSERT INTO "HRM"("ID", "NAME", "DEPT") VALUES ('1', 'zx', '22');
INSERT INTO "HRM"("ID", "NAME", "DEPT") VALUES ('2', 'wj', '22');
INSERT INTO "HRM"("ID", "NAME", "DEPT") VALUES ('3', 'lk', '33');
INSERT INTO "HRM"("ID", "NAME", "DEPT") VALUES ('4', 'po', '44');
INSERT INTO "HRM"("ID", "NAME", "DEPT") VALUES ('5', 'mm', '55');
INSERT INTO "HRM"("ID", "NAME", "DEPT") VALUES ('6', 'jz', '66');
INSERT INTO "HRM"("ID", "NAME", "DEPT") VALUES ('7', 'ui', '77');

INSERT INTO "LOG"("ID", "USERID", "DEPT", "LOG") VALUES ('1', '1', NULL, 'xx');
INSERT INTO "LOG"("ID", "USERID", "DEPT", "LOG") VALUES ('2', '1', NULL, 'xxx');
INSERT INTO "LOG"("ID", "USERID", "DEPT", "LOG") VALUES ('3', '2', NULL, 'sss');
INSERT INTO "LOG"("ID", "USERID", "DEPT", "LOG") VALUES ('5', '3', NULL, 'ss');
INSERT INTO "LOG"("ID", "USERID", "DEPT", "LOG") VALUES ('6', '3', NULL, 'ss');
INSERT INTO "LOG"("ID", "USERID", "DEPT", "LOG") VALUES ('7', '4', NULL, 'sss');

者两个表之间通过HRM表的ID和LOG表的USERID进行关联,现在需要将LOG表的历史记录中的DEPT字段更新为他的userid对应的HRM表的DEPT字段的值。方法如下所示。

方法一

update LOG SET (dept) = (select dept from HRM where id = LOG.userid)

方法二

merge into LOG using HRM on (LOG.USERID = HRM.ID)
when matched
then update set LOG.DEPT = HRM.DEPT

参考

1.oracle怎么用一个表的多个字段数据更新另一个表相应的字段中
2.Oracle中Merge into用法总结

转载于:https://www.cnblogs.com/ZiYangZhou/p/8185932.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值