在单个SQL查询中插入和关联记录?

时间:2010-09-14 13:54:34

标签: sql sql-server sql-server-2005

我正在尝试将旧数据库中的数据复制到新数据库中,并将其转换为遵循新的数据库结构。旧的看起来像这样:

表1:

Id | Col A 
----------
1      0
2      8
3      7
4      1

在新数据库中,表1现在看起来像这样,其中来自col A的数据现在在另一个表中,并且它通过A_Id外键列链接回表1:

表1:

Id | A_Id_FK
----------
1      0
2      1
3      2
4      3

表2:

Id | Col A
----------
0      0
1      8
2      7
3      1

所以......我的SQL技能非常生疏。我需要一次(读取:速度无关紧要)查询创建表2记录,同时将它们链接到表1记录。另一点需要提及的是我有两个数据库。一个是表1的旧表,另一个是表2的新表,表1表示除了A_Id_FK之外的所有其他信息,现在它只链接到表2中的空记录对于每条记录。

提前致谢。

编辑 - 为了更加清晰,新数据库中的表2为空。旧数据库中的Col A不是一个唯一的数字(事实上,它根本不是一个数字,但它只是为了简单起见)。填充新数据库中的表1,但是对于具有有效外键的所有内容,A_Id_FK中的值都设置为1。最后,即使是相同的Col A记录也需要在新数据库中拥有自己的实例。

3 个答案:

答案 0 :(得分:2)

您可以使用CURSOR(Table_2.id是标识):

DECLARE @id INT
DECLARE @col_a VARCHAR(50)
DECLARE db_cursor CURSOR FOR 
    SELECT id, col_a
    FROM Table_Source

OPEN db_cursor  
    FETCH NEXT FROM db_cursor INTO @id, @col_a

WHILE @@FETCH_STATUS = 0  
BEGIN  
    INSERT INTO Table_2 (col_a) VALUES (@col_a)
    INSERT INTO Table_1 (id, fk) VALUES (@id, @@IDENTITY)

    FETCH NEXT FROM db_cursor INTO @id, @col_a
END  

CLOSE db_cursor  
DEALLOCATE db_cursor

答案 1 :(得分:0)

假设数据库“Old”和“New”具有上述表结构,假设两个数据库都存在于同一个SQL实例中,假设Old Table1中的每个“ColA”值都出现在New Table2中,并假设你是第一次加载数据,一个版本是:

INSERT New.dbo.Table1 (Id, A_Id_FK)
 select Old.Id, New2.Id
  from Old.dbo.Table1 Old
   inner join New.dbo.Table2 New2
    on New2.ColA = Old.ColA

听起来你可能已经填充了New..Table1?如果是这样,您需要某种更新语句将该表与Old..Table1和New..Table2相链接。

答案 2 :(得分:0)

我假设Table2中的Id是下面代码中的标识。

insert into Table2
    (ColA)
    select distinct ColA
        from OldTable1

insert into Table1
    (Id, A_Id_FK)
    select ot.Id, t2.Id
        from OldTable1 ot
            inner join Table2 t2
                on ot.ColA = t2.ColA