复制数据并在目标表中增加PK

时间:2015-08-11 20:11:05

标签: sql tsql sql-server-2005

我有一个临时表,其数据需要拆分为3个其他表。这些表中的每一个都有一个主键,它不相互共享或与临时表共享。这是一个小样本:

表1

RSN     AGENT   STATUS  STATUS DECRIPTION
0   280151  51  Terminated
1   86  57  C/O Comp Agent Dele
2   94  57  C/O Comp Agent Dele
3   108 51  Terminated

表2

RSN     AGENT   CITY
1   10  Englewood
2   123 Jackson
3   35  Eatontown
4   86  Trenton

表3

RSN     AGT     SIGN    NO_EMP  START_DATE
0   241008  Y   1   2002-10-31 00:00:00.000
1   86  Y   0   2002-10-24 09:51:10.247
2   94  Y   0   2002-10-24 09:51:10.247
3   108 Y   0   2002-10-24 09:51:10.247

我需要检查每个表以查看临时表中的数据是否存在,如果不存在,我想插入那些带有RSN#的行,从该表中的最大数字开始。因此,如果我在第一个表中有5000条记录,并且我将添加5000个新行,则它们将被编号为5001到10000.

然后我需要检查是否有任何列已更改以匹配行并更新它们。

提前感谢您的协助。

斯科特

2 个答案:

答案 0 :(得分:0)

您必须重复T1,2和3的代码,并更新匹配和不匹配的列。

插入新值:

Insert Into Table1(col1, col2, ...)
Select t.col1, t.col2
From temp as t 
Left Join table1 as t1 On t.matchcol1 = t1.matchcol1 and t.matchcol2 = t1.matchcol2
Where t.col1 is null

将matchcol1替换为T和T1之间匹配列的列表

更新

Update t1 set col1 = t.col1, t.col2 = t1.col2, ...
From table1 as t1
Inner Join temp as t On t.matchcol1 = t1.matchcol1 and t.matchcol2 = t1.matchcol2 and ...
Where col1 <> t.col1 or t.col2 <> t1.col2 or ...

这可能也有效:

我不确定您是否真的需要更新某些内容或只是插入以及如何链接temp和table1以了解它是否已被更改。

Insert Into Table1(RSN, AGENT, STATUS, STATUS, DECRIPTION)
Select (Select max(RSN) From table1) + Row_number() over(order by agent)
     , AGENT, STATUS, STATUS, DECRIPTION
From (
   Select AGENT, STATUS, STATUS, DECRIPTION From TempTable
   Except
   Select AGENT, STATUS, STATUS, DECRIPTION From Table1
) as t1

或者您可以升级到SQL Server 2008并使用Merge。这会容易得多

答案 1 :(得分:0)

我最后在我的临时表中添加了4个新列; temp rsn#,这是一个以1开头的标识列,以及我3个目标表中每个目标表的rsn#。我创建了一个变量,从每个表中获取最大值,然后将其添加到我的temp rsn#中。