在线急等SQL 2008代码

victory610 2011-08-24 03:09:17

现有三个表,分别是员工信息表(EmpInfo),员工状态表(EmpState)和员工级别表(EmpRank)。
1、员工信息表(EmpInfo)
员工ID(EmpNo) 员工姓名(EmpName) 员工级别(Rank) 员工身份证号(EmpID) 员工学历(EmpEdu) 员工ID(EmpNo)
010001 张三 项目经理 111111111111111111 硕士 正式
010002 李四 高级项目经理 222222222222222222 博士 正式
010003 王五 项目助理 333333333333333333 本科 实习
010004 赵六 经理 444444444444444444 硕士 正式
010005 周七 项目经理 555555555555555555 本科 离职
010006 钱八 项目助理 666666666666666666 本科 实习

2、员工状态表(EmpState)
员工ID(EmpNo) 员工ID(EmpNo)
010001 正式
010002 正式
010003 实习
010004 正式
010005 离职
010006 实习

3、员工级别表(EmpRank)
员工ID(EmpNo) 员工级别(Rank)
010001 项目经理
010002 高级项目经理
010003 项目助理
010004 经理
010005 项目经理
010006 项目助理

现在我更新了员工状态表(EmpState)中010003和010006两名员工的状态,由实习转为正式,结果如下
员工ID(EmpNo) 员工ID(EmpNo)
010001 正式
010002 正式
010003 正式
010004 正式
010005 离职
010006 正式

接着我又更新了员工级别表(EmpRank)中010001的级别,有项目经理变为高级项目经理,结果如下
员工ID(EmpNo) 员工级别(Rank)
010001 高级项目经理
010002 高级项目经理
010003 项目助理
010004 经理
010005 项目经理
010006 项目助理

我的问题是,能不能利用SQL Server 2008的新语法merge功能实现:
更新了员工状态表(EmpState)和员工级别表(EmpRank)的相关信息后,员工信息表(EmpInfo)的相关信息也会同步更新。
得到如下结果:
员工ID(EmpNo) 员工姓名(EmpName) 员工级别(Rank) 员工身份证号(EmpID) 员工学历(EmpEdu) 员工ID(EmpNo)
010001 张三 高级项目经理 111111111111111111 硕士 正式
010002 李四 高级项目经理 222222222222222222 博士 正式
010003 王五 项目助理 333333333333333333 本科 正式
010004 赵六 经理 444444444444444444 硕士 正式
010005 周七 项目经理 555555555555555555 本科 离职
010006 钱八 项目助理 666666666666666666 本科 正式




...全文
89 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
victory610 2011-08-25
  • 打赏
  • 举报
回复
按小F的方法终于搞定了,马上结贴。
--小F-- 2011-08-24
  • 打赏
  • 举报
回复
看看这个 

--------------------------------------------------------------------------

-- Author : htl258(Tony)

-- Date : 2010-04-25 01:10:28

-- Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)

-- Jul 9 2008 14:43:38

-- Copyright (c) 1988-2008 Microsoft Corporation

-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)

-- Blog : http://blog.csdn.net/htl258

-- Subject: SQL2008 Merge关键字用法与简例

--------------------------------------------------------------------------

--Merge 语法是对表进行插入,更新,删除这三个操作的合并。

--根据与源表联接的结果,对目标表执行插入、更新或删除操作。

--MERGE 语法包括如下五个主要子句:

-- MERGE 子句用于指定作为插入、更新或删除操作目标的表或视图。

-- USING 子句用于指定要与目标联接的数据源。

-- ON 子句用于指定决定目标与源的匹配位置的联接条件。

-- WHEN 子句用于根据ON 子句的结果指定要执行的操作。

-- OUTPUT 子句针对更新、插入或删除的目标对象中的每一行返回一行。





--示例:



USE tempdb

GO

--创建表A

IF NOT OBJECT_ID('[A]') IS NULL

DROP TABLE [A]

GO

CREATE TABLE A(ID INT,ACOL VARCHAR(10))

GO

INSERT A VALUES(1,N'A')

INSERT A VALUES(2,N'B')

INSERT A VALUES(3,N'C')

INSERT A VALUES(6,N'X') --此记录在B表中不存在,删除

GO

--创建表B

IF NOT OBJECT_ID('[B]') IS NULL

DROP TABLE [B]

GO

CREATE TABLE B(ID INT,BCOL VARCHAR(10),XCOL VARCHAR(10))

GO

INSERT B VALUES(1,N'A',N'T') --1的ID与A表ID匹配且指定值与A表指定值对应相同,不变

INSERT B VALUES(2,N'P',N'O') --2和的ID与A表ID匹配,指定值与A表指定值对应不同,更新

INSERT B VALUES(3,N'P',N'N')

INSERT B VALUES(4,N'L',N'Y') --4和的ID与A表ID匹配,指定值在A表中对应不存在,插入

INSERT B VALUES(5,N'E',N'S')

GO

--开始合并两个表:

MERGE A --要处理的表

USING B --参照的表

ON A.ID=B.ID --关联条件

WHEN NOT MATCHED THEN INSERT VALUES(B.ID,B.BCOL) --如果要处理表没有参照表上的记录,则插入

WHEN MATCHED THEN UPDATE SET A.ACOL=B.BCOL --如果记录匹配,就更新目标表的匹配行

WHEN NOT MATCHED BY SOURCE THEN DELETE --如果要处理表的记录在参照表上不存在,则删除

OUTPUT $action, Inserted.*, Deleted.*; --相当于输出以上语句的操作记录



/*--result:

$action ID ACOL ID ACOL

---------- ----------- ---------- ----------- ----------

INSERT 4 L NULL NULL

INSERT 5 E NULL NULL

UPDATE 1 A 1 A

UPDATE 2 P 2 B

UPDATE 3 P 3 C

DELETE NULL NULL 6 X



(6 行受影响)

*/

--看看A表更新成什么样:

SELECT * FROM A

/*

ID ACOL

----------- ----------

1 A

2 P

3 P

4 L

5 E



(5 行受影响)

*/

--再变换一个字段

MERGE A --要处理的表

USING B --参照的表

ON A.ID=B.ID --关联条件

WHEN NOT MATCHED THEN INSERT VALUES(B.ID,B.XCOL)

WHEN MATCHED THEN UPDATE SET A.ACOL=B.XCOL

WHEN NOT MATCHED BY SOURCE THEN DELETE

OUTPUT $action, Inserted.*, Deleted.*;



/*--result:

$action ID ACOL ID ACOL

---------- ----------- ---------- ----------- ----------

UPDATE 1 T 1 A

UPDATE 2 O 2 P

UPDATE 3 N 3 P

UPDATE 4 Y 4 L

UPDATE 5 S 5 E



(5 行受影响)

*/

--再看看现在的A表像什么样

SELECT * FROM A

/*

ID ACOL

----------- ----------

1 T

2 O

3 N

4 Y

5 S



(5 行受影响)

*/

--小F-- 2011-08-24
  • 打赏
  • 举报
回复
当然可以
你的数据比较凌乱
mingpei0703 2011-08-24
  • 打赏
  • 举报
回复
可以,
Merge语句的作用是根据与源表联接的结果,对目标表执行插入、更新或删除操作。
主要作用是将另外一个表的数据合并到另外一个表中,被合并的表称为目标表,用来合并的表称为源表。这里的合并是广义的合并,包括插入,更新和删除操作。因此,可以用Merge语句完成对一个表的更新,插入和删除操作。

方法参考:http://blog.csdn.net/xuejie09242/article/details/4602913
AcHerat 元老 2011-08-24
  • 打赏
  • 举报
回复
1、要么去程序里直接做修改;
2、在两个基本表上加触发器来修改员工信息表!
q465897859 2011-08-24
  • 打赏
  • 举报
回复
在员工信息表(EmpInfo)表上写个触发器
快溜 2011-08-24
  • 打赏
  • 举报
回复
用触发器去更新。
AcHerat 元老 2011-08-24
  • 打赏
  • 举报
回复
没环境不好测试,楼主merge语法去写。

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧