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

时间:2018-12-13 20:45:41

标签: sql sql-server database

我有两个几乎完全相同的表,但相差约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”。

我已经调查了The multi-part identifier could not be boundhttp://www.sql-server-helper.com/error-messages/msg-4104.aspx中的错误,但是由于我没有使用JOIN或别名,这些都不能解决我的问题。因此,我不确定该怎么做。

我正在使用SQL Server 2017。

2 个答案:

答案 0 :(得分:1)

通过使用左联接,您可以从[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

答案 1 :(得分:0)

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

因此,在子查询的WHERE子句中(该子查询可以访问内部查询和外部查询,因此可以访问[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中的记录相匹配的记录。

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

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