首页 > 解决方案 > 插入第三个表,其中 2 个表具有相同的 Id

问题描述

我有一个巨大的数据库,想用更小的块来处理它,所以我试图编写脚本并将行复制到一个临时表上,处理它,然后将它们复制回来。

现在我已经PersonMeta从旧数据库中复制了大约 1000 行,现在想为People表插入相应的行。

所以基本上我想从whereolddb.People插入数据并具有相同的代码。newdb.Peoplenewdb.PersonMetanewdb.People

我创建了这个脚本,但由于某种原因它没有复制所有行。例如,它应该复制 1000 行时复制 960 行。

INSERT INTO [newdb].[dbo].[People] ([Id]
      ,[Name]
      ,[PersonId])
SELECT fp.[Id]
      ,fp.[Name]
      ,fp.[PersonId]
FROM [olddb].[dbo].[People] fp
INNER JOIN [newdb].[dbo].[PersonMeta] pm on
pm.PersonId = fp.PersonId

编辑:

我最初写了 100 行,它是 1000 行。所以查询选择 960(少 40)

编辑 2

People表有一些列的重复值PersonId。我删除了它们,现在在我运行查询之后它复制了 956 行(比以前少了 4 行)。

编辑3:

我创建了这个小提琴,它似乎工作得很好。

但是,我对数据库进行了一些查询。结果是,当我使用RIGHT JOIN未复制的那些记录的值进行查询时,它们都是 NULL。因此,当我运行以下查询时:

Select fp.*, fp.personid, pm.personid
From [olddb].[dbo].[People] fp
right join [newdb].[dbo].[PersonMeta] pm on
fp.personid = pm.personid

它返回这个:

在此处输入图像描述

我可以尝试复制数据的另一种方法吗?

标签: sqlsql-serverjoininner-join

解决方案


考虑到您想在新表中保留不同且唯一的记录。

下面的查询将创建与旧表相同的模式,并将旧表中存在的所有数据复制到新表中。

选择 * 进入 [newdb].[dbo].[People] from [olddb].[dbo].[People]

现在,如果您想让新表中的数据与 [newdb].[dbo].[PersonMeta] 中的唯一记录保持同步。你可以简单地做

从 personid 不在的 [newdb].[dbo].[People] 中删除(从 [newdb].[dbo].[PersonMeta] 中选择 personid)


推荐阅读