SQLserver使用映射表进行数据相关操作
基本需求:
老数据有老数据的顺序编码规则,新数据有新数据的顺序编码规则,但是老数据的编码还是要更新相应的东西,新数据也得实时更新,在新数据中已经用新编码规则对老数据对进行编码,在上报表中既要新增新数据,也要更新老数据与现有数据。
-------------------------------------------------
--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='' where Id=''
---------------修改老数据的年龄进行测试
update TB_New set Age='' where Id=''
SQLserver使用映射表进行数据相关操作的更多相关文章
- CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储
CockroachDB学习笔记--[译]CockroachDB中的SQL:映射表中数据到键值存储 原文标题:SQL in CockroachDB: Mapping Table Data to Key- ...
- 背景:表A数据误操作,被delete了,恢复。
SELECT MAX(Scn) FROM Sys.Smon_Scn_Time WHERE Time_Dp < TO_DATE('2015-09-18', 'YYYY/MM/DD') select ...
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- MySQL的数据库,数据表,数据的操作
数据库简介 概念 什么是数据库?简单来说,数据库就是存储数据的"仓库", 但是,光有数据还不行,还要管理数据的工具,我们称之为数据库管理系统! 数据库系统 = 数据库管理系统 + ...
- sqoop导入数据到hive表中的相关操作
1.使用sqoop创建表并且指定对应的hive表中的字段的数据类型,同时指定该表的分区字段名称 sqoop create-hive-table --connect "jdbc:oracle: ...
- mysql 5.7 laravel json类型数据相关操作
2018年10月16日18:14:21 官方文档中文翻译版 原文:https://dev.mysql.com/doc/refman/5.7/en/json.html 最后有部分实例和一个小总结 11. ...
- workbook数据相关操作
访问单个单元格 c = ws['A4'] #返回单元格A4,如果单元格不存在,则会自动创建 ws['A4'] = 4 #为单元格A4赋值为4 d = ws.cell(row=4, column=2, ...
- 查询sqlserver数据库,表占用数据大小
if exists(select 1 from tempdb..sysobjects where id=object_id('tempdb..#tabName') and xtype='u')dro ...
- MySql学习笔记【四、数据相关操作】
CURD--增改查删 创建数据 INSERT [INTO] tb_name [(col_name,...)] VALUES(val,..) 若列名缺省,表示插入全部列,也可指定部分列名 如: INSE ...
随机推荐
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章01
第 1 章 欢迎来到工作流的世界 …思想如蝴蝶般飞到我身边 —— Gossard / Vedder (译注:Gossard与Vedder是来自Pearl Jam乐队的2名乐手,该句出自他们的歌曲 ...
- 关于NopCommerce3.6版用户登录详解
一.登录方式 Nop登录方式有两种(且只能选择一种方式登录):一种是用用户名登录,另一种是用户注册邮箱登录,这个在后台可配置: 第一种:用户名登录 后台配置路径在商城设置à设置管理à客户设置:使用用户 ...
- 使用CORS:跨域两三事
本文为译文. 简介 APIS是可以将富网页应用串连在一起的线程.但是这个应用难以转给浏览器,跨域请求技术的选择被限制了,类似JSONP(由于安全考虑,使用会被限制),或者配置代理(设置和维护都比较头痛 ...
- Duilib扩展《01》— 双击、右键消息扩展
用过duilib的可能会发现,duilib中有些控件没能很好的区分左键.右键等消息.所以根据实际需要,我们需要进行相关区分处理,或者自行扩展. 一. 左键.右键消息区分 我们以CListUI控件来分析 ...
- cordova 开发属于自己的插件---android
还是需要开发出自己的插件的... 我的cordova version is 4.0.0 1.需要新建一个文件夹为 myplugin 1.1在myplugin文件夹下 新建 plugin.xml文件 ...
- Windows phone 8 学习笔记(6) 多任务(转)
Windows phone 8 是一个单任务操作系统,任何时候都只有一个应用处于活跃状态,这里的多任务是指对后台任务的支持.本节我们先讲讲应用程序的运行状态,然后看看支持的后台任务,包括:后台代理.后 ...
- 关于OJ上内存问题的试验
char类型占一个字节 int类型占4个字节 如果杭电OJ上给的范围是32678K,那么内存大小就是32678*1024=33554432 那么可以开到多大的数组呢?!可以开到很大,但是可用的就只有3 ...
- Android IOS WebRTC 音视频开发总结(五六)-- 如何测试网络性能?
本文主要介绍如何测试网络性能,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help 网络性能直接决定了视频通话效果,比如qq,很多时候我们我们觉得通 ...
- 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(六)-- 依赖注入
本篇将介绍Asp.Net Core中一个非常重要的特性:依赖注入,并展示其简单用法. 第一部分.概念介绍 Dependency Injection:又称依赖注入,简称DI.在以前的开发方式中,层与层之 ...
- PHPExcel上传sae遇到: -1:fail to get xml content
在用PHPExcel1.8.0来处理excel时,本地测试时好使的,但是要把代码部署到SAE,在上传代码的时候就会遇到这个问题. 部署代码中遇到问题: -1:fail to get xml conte ...