繁体   English   中英

将一个表中未包含的行插入到另一个表中

[英]Insert rows not contained in one table to another

我有两个几乎相同的表,但相差约100行(在150k中)。 我知道如何通过使用找到一个表中存在的所有行,而不找到另一个表中的所有行

SELECT [Column]
FROM [DB].[dbo].[Table_1] 
WHERE NOT EXISTS 
(SELECT * 
 FROM [DB].[dbo].[Table_1a] 
 WHERE [EDB].[dbo].[Table_1a].[Column] = [DB].[dbo].[Table_1].[Column])

但是我希望能够将Table_1缺少的行插入到Table_1a ,但是以上代码在插入语句中不起作用:

INSERT [DB].[dbo].[Table_1] 
SELECT *
FROM [DB].[dbo].[Table_1a]
WHERE NOT EXISTS 
    (SELECT * 
     FROM [DB].[dbo].[Table_1a] 
     WHERE [DB].[dbo].[Table_1a].[Column] = [DB].[dbo].[Table_1].[Column])

当我得到错误时:无法绑定多部分标识符“ DB.dbo.Table_1.Column”。

我已经从无法绑定多部分标识符的位置调查了该错误,并且http://www.sql-server-helper.com/error-messages/msg-4104.aspx,但是这些都不能解决我的问题不使用JOIN或别名。 因此,我不确定该怎么做。

我正在使用SQL Server 2017。

你可以得到所有从行[DB].[dbo].[Table_1a]不存在中[DB].[dbo].[Table_1a] ,使用左连接:

INSERT [DB].[dbo].[Table_1] 
  SELECT t1a.*
  FROM [DB].[dbo].[Table_1a] t1a
  LEFT JOIN [DB].[dbo].[Table_1] t1
  ON t1a.[Column] = t1.[Column]
  WHERE t1.[Column] IS NULL

问题是您有两个[DB].[dbo].[Table_1a] FROM子句引用,而您没有为它们加别名。

因此,在子查询的WHERE子句中(该子查询可以访问内部查询和外部查询,因此可以同时访问[DB].[dbo].[Table_1a][DB].[dbo].[Table_1a] ),优化器不知道您在此表示的是哪个:

WHERE [DB].[dbo].[Table_1a].[Column] = ...

如果为这些表引用提供两个不同的别名,并在WHERE子句中选择一个,则应该没问题:

INSERT [DB].[dbo].[Table_1] 
SELECT *
FROM [DB].[dbo].[Table_1a] t1
WHERE NOT EXISTS 
    (SELECT * 
     FROM [DB].[dbo].[Table_1a] t2
     WHERE t2.[Column] = [DB].[dbo].[Table_1].[Column])

编辑:

另一个问题是,要插入的Table_1在记录Table_1a那里不存在的记录Table_1a匹配的记录Table_1

这没有多大意义。 可能的意思是插入1不存在的1a记录。 因此,可能是您的意思是,它可以正常工作:

INSERT INTO Table_1
SELECT * FROM Table_1a t2
WHERE NOT EXISTS(
    SELECT * FROM Table_1 t1
    WHERE t1.Col1=t2.Col1
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM