插入第三个表,其中两个表具有相同的ID

时间:2019-09-09 06:43:36

标签: sql sql-server join inner-join

我有一个庞大的数据库,并且希望按较小的块进行处理,因此我试图编写脚本并将行复制到临时表中,进行处理,然后将其复制回。

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

因此,基本上我想将olddb.Peoplenewdb.People具有相同代码的数据从newdb.PersonMeta插入newdb.People

我已经创建了此脚本,但是由于某种原因,它无法复制所有行。例如,它应复制960行,而应复制1000行。

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:

我创建了this fiddle,它似乎运行得很好。

但是,我对数据库做了一些查询。当我用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

它返回以下内容:

enter image description here

还有其他方法可以尝试复制数据吗?

4 个答案:

答案 0 :(得分:0)

任一表的“ PersonID”字段中都可能存在NULL值。如果是这样,请删除/更新NULL记录,然后重试。

答案 1 :(得分:0)

首先,您需要单独检查记录,以查询产生的信息。

检查此查询的输出。它会按预期创建100行。

{"level":"INFO","timestamp":"2019-09-06 11:33:24,987","thread":"http-nio-8090-exec-5","file":"AccountService.java","line":"51","message":"A sample info log","trace":""}

但是,如果创建的行多于预期行,则可以尝试使用一些过滤器将结果测试为SELECT fp.[Id] ,fp.[Name] ,fp.[PersonId] FROM [olddb].[dbo].[People] fp INNER JOIN [newdb].[dbo].[PersonMeta] pm on pm.PersonId = fp.PersonId

因此它将筛选出具有isnull(pm.PersonId,0)<>0 and isnull(fp.PersonId,0)<>0的记录,这可能会复制您的记录。 所以最终的测试查询是

personId is null

如果仍然无法解决问题,请共享表的表结构,这可能有助于理解问题。

答案 2 :(得分:0)

好的,现在我觉得很傻,但是问题是,在People表的旧PersonMeta表中,并非所有行都具有相应的值。我以为他们有它,因为我在查询中使用了Id而不是PersonId

简而言之,发布的查询实际上是正确的。

答案 3 :(得分:0)

考虑要在新表中保留唯一的记录。

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

选择*到[newdb]。[dbo]。[people] from [olddb]。[dbo]。[People]

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

从[newdb]。[dbo]。[People]中删除,不在其中的人员编号(从[newdb]。[dbo]。[PersonMeta]中选择人员编号)