在表中为另一个表中的每个id插入行

时间:2009-01-14 14:31:45

标签: sql tsql

我尝试在这里搜索类似的解决方案,但没有看到一个,所以我想知道完成以下操作的最佳方法是什么。

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

例如 表1 - id,field1,field2,field3 ...... 表2 - table1.id,field1 ...

问题是因为我们正在将其迁移到实时环境中,所以我们需要在表1中为表2中的每一行填充一个包含表1中id的行。 ex,表1 - 1,test,null 表2现在需要为table1中的每一行提供:1,null,...等等。主要问题是表1中的ID不是全部顺序的,因此我们必须从表1中读取,然后根据找到的id插入到表2中。

有没有更简单的方法可以解决这个问题? 提前致谢 乔

另外澄清一下,表2将是新数据,它将包含在表1中的唯一内容是保持外键关系的id

这也是sql server 2000

4 个答案:

答案 0 :(得分:46)

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

所以假设

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

创建table2后,您只需运行此插入语句

即可
insert into table2(table1_ID) 
select ID from table1

答案 1 :(得分:13)

我不确定我是否正在关注你,但这样的事情对你有用吗?

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

如果我理解正确,你需要table2中记录table1中的每条记录。这样就可以了。只需按正确的顺序匹配select中的字段,并为table1中table1中没有的任何字段指定常量。

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

答案 2 :(得分:3)

您需要阅读这篇文章。

What are the most common SQL anti-patterns?

  

主要问题是表1中的id不是全部顺序的,因此我们必须从表1中读取,然后根据找到的id插入到表2中

是的,请看上面文章中的答案,并使用第2项编写一个键行走循环。

确保在编写insert语句时,提供了一个字段列表 - 正如我在第1项中所说的那样。

答案 3 :(得分:-1)

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

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

从原始表中选择id,使用它为扩展表构建Bcp文件,然后将其Bcp放入。

许多人发现,在10,000个记录的文件中,Bcp的性能更高,而不是一个包含17,000,000行的humungus文件。

此外,您可以在上线之前在后台执行此操作,并编写一个t-sql作业以便在您使用id的snapshop之后插入。