基本需求:
老數據有老數據的順序編碼規則,新數據有新數據的順序編碼規則,但是老數據的編碼還是要更新相應的東西,新數據也得實時更新,在新數據中已經用新編碼規則對老數據對進行編碼,在上報表中既要新增新數據,也要更新老數據與現有數據。
------------------------------------------------- --Author:Oliver QIN --Date:2015-11-07 --DESC:使用映射表對老數據進行更新 ------------------------------------------------- --存儲老數據的表 --drop table TB_old
CREATE TABLE TB_old(Id INT,IdSeq VARCHAR(20),Name VARCHAR(200),Adress varchar(200),Age int) -------------------------------------------------------------------- --插入測試數據(2014年的人員信息表) ---目前的編號是以省份來編號的,例如下面插入的測試數據
/*************************老的人力資源管理系統中******************************/
INSERT INTO TB_old SELECT 1,'yunnan01','JACK','雲南昆明',45 union all
SELECT 2,'yunnan02','Tom','雲南曲靖',82 union all
SELECT 3,'yunnan03','Alice','雲南麗江',60 union all
SELECT 4,'yunnan04','Jerry','雲南昭通',26 union all
SELECT 5,'chongqin05','Terry','重慶江北',22
---隨着時間的變遷,需要把編號進行修改,統一為China開頭的編號,例如:China01
--那接着就建立映射表 /*********************************映射表***************************************/
--drop table Mapping
CREATE TABLE Mapping (Old_IdSeq varchar(100),New_IdSeq varchar(100)) --插入映射關系
insert into Mapping select 'yunnan01','China01' union all
select 'yunnan02','China02' union all
select 'yunnan03','China03' union all
select 'yunnan04','China04' union all
select 'chongqin05','China05'
---這是2015年在新人力資源管理系統中新生成的一張信息表 注明:在老系統中已經生成的編號不可以替換成現有編號,需要延用至退休 --drop table TB_New 注:新的人力資源表中JACK的年齡更新為99,並且新加了JOSN的相關信息
CREATE TABLE TB_New(Id INT,IdSeq VARCHAR(20),Name VARCHAR(200),Adress varchar(200),Age int) --插入新的測試數據
/*************************新的人力資源管理系統中******************************/
INSERT INTO TB_New SELECT 1,'China01','JACK','雲南昆明',99 union all
SELECT 2,'China02','Tom','雲南曲靖',82 union all
SELECT 3,'China03','Alice','雲南麗江',60 union all
SELECT 4,'China04','Jerry','雲南昭通',26 union all
SELECT 5,'China05','Terry','重慶江北',22 union all
SELECT 6,'China06','JOSN','廣東深圳',25
-------------現在有如下需求 /********************************************************* 隨着時間的推移,需要實時的更新他們的相關信息,假設錄入該年齡的時間是2014年 2015年系統進行升級,錄入的相關信息則按新的規則命名編號,如果年齡大於45歲則不更新相關信息,視為退休 新的系統中已經把老的信息按照新的編碼規則進行編碼,但是這些信息需要用來上報給總經理查看。 */
/**************************上報數據庫中的信息*******************************************/
/*上報庫中的信息是以前老的系統中的數據*/
--drop table Report_Rpt
CREATE TABLE Report_Rpt(Id INT,IdSeq VARCHAR(20),Name VARCHAR(200),Adress varchar(200),Age int) INSERT INTO Report_Rpt select * from TB_old /************************************************************************************** 要求:使用新的人力資源管理系統中提供的數據對更新上報信息中的年齡 */
--建立映射視圖,用於關聯更新
go
--select * from Differrence_Data
CREATE VIEW Differrence_Data as
select A.Age,B.Old_IdSeq from TB_New A left join Mapping B ON A.IdSeq=B.New_IdSeq left join TB_old C ON C.IdSeq=B.Old_IdSeq WHERE A.Age<>C.Age ---------------------------------------------------------
GO
--DROP PROC Get_NewInfo
CREATE PROC Get_NewInfo AS
BEGIN
-------------------------------------------------------情況一:更新老編碼對應的年齡信息
if((select COUNT(*) from Differrence_Data)>0) -------------------------如果在視圖Differrence_Data中存在數據,那么更新相應的老編碼信息
UPDATE Report_Rpt SET Age=A.Age FROM Differrence_Data A WHERE A.Old_IdSeq=Report_Rpt.IdSeq IF ( (select COUNT(1) from TB_New where IdSeq not in (SELECT New_IdSeq FROM Mapping union all
select IdSeq FROM Report_Rpt ) ) >0 ) -------------------------------------------------情況二:將新增的數據插入到上報表中
---插入新增的數據到上報信息表中
insert into Report_Rpt select * from TB_New A WHERE A.IdSeq NOT IN (SELECT New_IdSeq FROM Mapping UNION all
select IdSeq FROM Report_Rpt) ------------------------------------------------情況三:更新新編碼對應的年齡信息
IF ( (SELECT COUNT(1) FROM TB_New WHERE IdSeq not in (select New_IdSeq from Mapping) AND IdSeq IN (SELECT IdSeq FROM Report_Rpt) )>0 ) --------------------更新新增加數據年齡變更的信息
UPDATE Report_Rpt SET Age=A.Age FROM TB_New A WHERE A.IdSeq not in (select New_IdSeq from Mapping) AND A.IdSeq IN (SELECT IdSeq FROM Report_Rpt) AND A.IdSeq = Report_Rpt.IdSeq END
--執行存儲過程
EXEC Get_NewInfo --老人力資源表
select * from TB_old --新人力資源表
select * from TB_New --映射表
select * from Mapping --上報表
select * from Report_Rpt --------------------------------------------
--刪除表語句
--DROP TABLE TB_old,TB_New,Mapping,Report_Rpt
--------------------------------以下是測試老編碼年齡變化跟新編碼年齡變化還有新增新的人員信息時,是否也會更新跟插入相應的數據
--------------------------------------改變新人力資源系統中的數據進行邏輯測試
insert into TB_New SELECT 7,'China07','測試01','雲南昆明',21 union all
SELECT 8,'China08','測試02','雲南昆明',33
---------------修改新數據進行測試
update TB_New set Age='100' where Id='6'
---------------修改老數據的年齡進行測試
update TB_New set Age='100' where Id='1'