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