zoukankan      html  css  js  c++  java
  • 将一个表的字段更新到另一个表中去

    描述

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

    字段名字 类型 备注
    ID NUMBER 用户id
    NAME VARCHAR2 用户名字
    DEPT NUMBER 部门id

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

    字段名字 类型 备注
    ID NUMBER 签字意见id
    USERID NUMBER 用户id
    DEPT NUMBER 部门id
    LOG VARCHAR2 签字意见内容

    数据库使用的是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用法总结

  • 相关阅读:
    IO 单个文件的多线程拷贝
    day30 进程 同步 异步 阻塞 非阻塞 并发 并行 创建进程 守护进程 僵尸进程与孤儿进程 互斥锁
    day31 进程间通讯,线程
    d29天 上传电影练习 UDP使用 ScketServer模块
    d28 scoket套接字 struct模块
    d27网络编程
    d24 反射,元类
    d23 多态,oop中常用的内置函数 类中常用内置函数
    d22 封装 property装饰器 接口 抽象类 鸭子类型
    d21天 继承
  • 原文地址:https://www.cnblogs.com/ZiYangZhou/p/8185932.html
Copyright © 2011-2022 走看看