Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在单个SQL查询中插入和关联记录?_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

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

在单个SQL查询中插入和关联记录?,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我试图将数据从旧数据库复制到新数据库,并将其转换为新的数据库结构。旧的看起来像这样: 表1: Id | Col A ---------- 1 0 2 8 3 7 4 1 Id | A_Id_FK ---------- 1 0 2 1 3 2 4 3 在新数据库中,表1如下所示,其中A列的数据现在位于另一个表中,并通过A_Id外键列链接回表1: 表1: Id | Col A ---------- 1

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

表1:

Id | Col A 
----------
1      0
2      8
3      7
4      1
Id | A_Id_FK
----------
1      0
2      1
3      2
4      3
在新数据库中,表1如下所示,其中A列的数据现在位于另一个表中,并通过A_Id外键列链接回表1:

表1:

Id | Col A 
----------
1      0
2      8
3      7
4      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为空。旧数据库中的列A不是唯一的数字(事实上,它根本不是一个数字,但为了简单起见,它就是这样)。新数据库中的表1已填充,但A_Id_FK中的值被设置为1,以便所有内容都具有有效的外键。最后,即使是相同的Col A记录也需要在新数据库中有自己的实例。

假设数据库“旧”和“新”具有上述表结构,假设两个数据库都存在于同一个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语句将该表与旧..Table1和新..Table2链接起来。

我假设表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
您可以使用游标(表2.id为标识):


在原来的问题中澄清了一点。每一种可乐都需要它自己的实例,即使它们是一样的。好吧,现在你失去了我。如果ID 1的ColA='XXX'和ID 2的ColA='XXX',您想在表2中创建两个'XXX'实例吗?如果是这样的话,您就失去了通过尝试按照您描述的方式规范化表而可能获得的任何价值。我知道这听起来有点不对劲,但为了示例的目的,对其进行了简化。实际上,Col A是表1中记录的开始日期。因此,我们正朝着一个包含许多通用“任务”的表前进,每个任务都有一个开始日期。新表1中的记录包含关于每个一般任务的抽象信息。谢谢,这正是我所要做的。