Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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 插入第三个表,其中两个表具有相同的Id_Sql_Sql Server_Join_Inner Join - Fatal编程技术网

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

Sql 插入第三个表,其中两个表具有相同的Id,sql,sql-server,join,inner-join,Sql,Sql Server,Join,Inner Join,我有一个巨大的数据库,希望通过较小的块来处理它,所以我尝试编写脚本并将行复制到临时表中,处理它,然后将它们复制回来 现在,我已经将大约1000行从旧数据库复制到PersonMeta中,现在想为People表插入相应的行 所以基本上我想把数据从olddb.People插入newdb.People其中newdb.PersonMeta和newdb.People有相同的代码 我已经创建了这个脚本,但由于某些原因,它没有复制所有的行。例如,当它应该复制1000行时,它复制960行 INSERT INTO

我有一个巨大的数据库,希望通过较小的块来处理它,所以我尝试编写脚本并将行复制到临时表中,处理它,然后将它们复制回来

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

所以基本上我想把数据从
olddb.People
插入
newdb.People
其中
newdb.PersonMeta
newdb.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: 我创造了,它似乎工作得很好

然而,我对数据库做了一些查询。结果是,当我使用
右连接进行查询时,未复制的记录的值都为空。因此,当我运行以下查询时:

Select fp.*, fp.personid, pm.personid
From [olddb].[dbo].[People] fp
right join [newdb].[dbo].[PersonMeta] pm on
fp.personid = pm.personid
它返回以下内容:


是否有其他方法可以尝试复制数据?

两个表的PersonID字段中都可能有空值。如果是,请删除/更新空记录并重试

首先,您需要单独检查您的记录,查看查询生成的内容

检查此查询的输出。它应该按照您的预期创建100行

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和isnull(fp.PersonId,0)0

因此,它会过滤掉
personId为null的记录,这可能会复制您的记录。
所以测试的最终查询是

SELECT fp.[Id]
      ,fp.[Name]
      ,fp.[PersonId]
FROM [olddb].[dbo].[People] fp
INNER JOIN [newdb].[dbo].[PersonMeta] pm on
pm.PersonId = fp.PersonId and isnull(pm.PersonId,0)<>0 and isnull(fp.PersonId,0)<>0
选择fp。[Id]
,fp.[姓名]
,fp.[人形]
来自[olddb].[dbo].[People]fp
内部连接[newdb].[dbo].[PersonMeta]pm on
pm.PersonId=fp.PersonId和isnull(pm.PersonId,0)0和isnull(fp.PersonId,0)0

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

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


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

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

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

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

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


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

您的查询看起来不错,您能否提供一个样本数据和所需结果作为格式化文本。id似乎不是自动递增的。您似乎在newdb.People或PersonMeta表中复制了PersonId kye,从而创建了这些数据records@sami该数据库有数百万条记录。不确定如何创建示例以创建相同的结果。这将很难做到so@ZaynulAbadinTuhin没有,我检查了结果。旧表中有几行在新表中不存在。没有重复。谢谢你的回答。在我的问题中,我写了100行,其中1000行。因此,查询生成的行数比预期的少。我照你说的做了,检查了结果。任何行都没有
NULL
值。事实上,我对它们进行了分组,所有行的计数都是1,所以上面的查询返回了多少行……查询中使用的两个表的单个行计数也是多少,
olddb.dbo.People
表有6108798条记录,`[newdb].[dbo].[PersonMeta]`有1000条记录,查询结果有956行。