將一個表的字段更新到另一個表中去


描述

做一個需求需要記錄用戶留下簽字意見時的職位信息,並且簽字意見中留下的職位信息不隨他的職位的調動變化而變化。在標准產品的簽字意見表里面沒有記錄職位信息的字段,這就需要我們添加一個字段用於存儲當前操作者的職位信息,對於新的數據我們可以在插入簽字意見的時候一並插入。但是對於歷史數據,我們就需要通過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用法總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM