在表中为每个ID在另一个表中插入行

我试图寻找类似的解决scheme,但没有看到一个,所以我想知道什么是完成以下最好的方法。

我有一个有1700万行的表,都有一个唯一的ID。 我们最近创build了一个新的表,这个表将与上一个表一起使用,其中新表的外键是旧表的唯一ID。

例如。
表1 – id,field1,field2,field3 …表2 – table1.id,field1 …

问题是,因为我们正在把它迁移到一个实际的环境中,所以我们需要用表1中的每一行包含来自表1的id的行来填充表2.现在需要表1-1的test,null表2对于table1中的每一行,都有:1,null,…等等。 主要问题是表1中的ID不是全部顺序,所以我们必须从表1中读取,然后根据find的ID插入到表2中。

有没有更简单的方法来解决这个问题? 在此先感谢乔

另外为了澄清,表2将是新数据,并且它将从表1中唯一包含的是保持外键关系的id

这也是SQL Server 2000

你需要阅读这篇文章。

什么是最常见的SQL反模式?

主要问题是表1中的ID不是全部顺序,所以我们必须从表1中读取,然后根据find的ID插入到表2中

是的,看看我上面的文章中的答案,并使用Item#2编写一个键循环循环。

确保在写入插入语句时,您提供了一个字段列表 – 正如我在项目#1中所说的那样。

如果我理解正确的话,你需要table1中的每个logging的一个logging。 我也相信除了对table1的引用之外,table2最初应该包含空行。

所以假设

table1 (ID, field1, field2, ...) table2 (ID, table1_ID, fieldA, fieldB,...) -- where table1_ID is a reference to ID of table1 

创buildtable2后,你可以简单地运行这个插入语句

 insert into table2(table1_ID) select ID from table1 

我不确定我是否跟着你,但是会有这样的事情为你工作?

 INSERT INTO table2 ( SELECT field1, field2, field3... FROM table1 ) 

如果我理解正确,你需要table2中的每个logging的logging。 这将做到这一点。 只需按照正确的顺序在select中匹配您的字段,并为table2中没有的任何字段指定常量。

HTH。 让我知道,如果我不理解,我试图再次帮助。

有了这么多行,您可能会遇到事务日志空间问题,以及运行大型插入事务的时间长度问题。

如果运行时间是一个约束,我会认真推荐使用Bcp(或者根据平台使用什么工具)

从原始表中选出id,用它为扩展表build立一个Bcp文件,然后用Bcp把它join。

很多人发现它更多的performance在10,000个logging的文件,而不是一个17000000行的humungus文件的Bcp。

另外,你可以在上线之前在后台做这件事,然后写一个t-sql的工作来提取,并且在你拿到id的snapshop后可能已经插入了。