2010-10-08 41 views
2

我有2个表T1和T2SQL - 插入查询中使用更新的标识种子的另一嵌件

T1设有一个主键10条独特的记录(标识种子)
T2具有对每条记录外键多entires在T1

T1有2列:PrimaryKey的 - 数据
T2有2列:PrimaryKey的 - FoeignKey(这FK是T1的主键)

我需要编写一个查询,将选择所有记录从T1和插入新的条目本身,即T1,无线相同的数据,并且由于T1上的PK是身份种子,这将自动生成一个新的ID,一旦生成这个新ID,我需要使用这个新身份加入T2和INSERT新相关记录。

我知道这会重复数据,这不是关注,这是一次性事务,所以查询不需要高效,但没有游标请,最好是,如果这可以实现使用SELECT和INSERTS无需使用外部变量进行循环!
谢谢!

更新:如果T1中有条目并不总是建议在表T2中必须有相应的条目/条目。

P.S.使用SQL Server 2005

回答

2

假设在T2的主键也IDENTITY IM,使用:

-- Populate T1 
INSERT INTO T1 
SELECT data 
    FROM T1 

-- Populate T2 with T1 values 
INSERT INTO T2 
SELECT primary_key 
    FROM T1 x 
WHERE EXISTS(SELECT NULL 
       FROM T2 y 
       JOIN T1 z ON z.primary_key = y.foreign_key 
       WHERE z.data = x.data 
       AND z.primary_key != x.primary_key) 
+0

当T2可能没有T1(某些)数据的条目时,这会产生影响吗? – 2010-10-08 03:52:40

+0

@Murtaza:如果T1中的第一批10个记录中的任何一个在T2中没有子记录,则第二个查询将创建这样的记录。如果您的需求不太抽象,建议可能会限制您最初没有提及的规则的方法会更容易。否则,如果生成虚拟数据,我不会看到问题。 – 2010-10-08 03:56:40

+0

谢谢 - 我刚刚更新了帖子,信息中T2可能没有T1中所有相应记录的条目,在这种情况下,我将不得不忽略这些记录。 – 2010-10-08 04:02:09

1

如果在表上没有任何当前活动,像下面将将完全复制数据。它不一定是动态sql - 这只是为了自动化启动标识种子。

如果表中还有一些其他数据,您可以轻松处理这些数据以复制或加入数据。

declare @maxID int 

select @maxID = max(pk) 
from T1 

declare @sql nvarchar(max) 
set @sql = 
'create table #T1 
(
new_pk int not null identity(' + cast(@maxID as varchar) + ',1) 
,old_pk int 
,data nvarchar(max) 
) 

insert into #T1 (old_pk, data) 
select pk, data 
from T1 

insert into T1 (data) 
select data 
from #T1 

insert into T2 (fk) 
select new_pk 
from #T1 
inner join T2 on T2.fk = #T1.old_pk 

drop table #T1 
' 

exec sp_executesql @sql 
+0

谢谢!这就像一个魅力,只是想要更多的东西在我选择的解决方案,因为避免临时表,但这也是一个同样完美的解决方案:) – 2010-10-08 04:47:09