我有一个庞大的数据库,并且希望按较小的块进行处理,因此我试图编写脚本并将行复制到临时表中,进行处理,然后将其复制回。
现在,我已经从旧数据库复制了约1000行到PersonMeta
中,现在想为People
表插入相应的行。
因此,基本上我想将olddb.People
和newdb.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)
People
表的PersonId
列有一些重复的值。我删除了它们,现在运行查询后,它复制了956行(比以前少了4行)。
我创建了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
它返回以下内容:
还有其他方法可以尝试复制数据吗?
答案 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]中选择人员编号)