代码之家  ›  专栏  ›  技术社区  ›  Ocelot20

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

  •  1
  • Ocelot20  · 技术社区  · 14 年前

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

    表1:

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

    在新数据库中,表1现在看起来是这样的,其中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\u Id\u FK之外的所有其他信息,目前每个记录只链接到表2中的一个空记录。

    编辑-为了更加清楚,新数据库中的表2是空的。旧数据库中的Col A不是唯一的数字(事实上,它根本不是一个数字,但为了简单起见就是这样)。新数据库中的表1已填充,但\u Id \u FK中的值被设置为1,以便所有内容都具有有效的外键。最后,即使是相同的Col A记录也需要在新数据库中有自己的实例。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Branimir    14 年前

    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
    
        2
  •  0
  •   Philip Kelley    14 年前

    假设数据库“Old”和“New”具有上述表结构,假设两个数据库都存在于同一个SQL实例中,假设旧表1中的每个“ColA”值都存在于新表2中,并且假设您是第一次加载数据,则一个版本为:

    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
    

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

        3
  •  0
  •   Joe Stefanelli    14 年前

    我假设表2中的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