我有两个几乎完全相同的表,但相差约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 bound和http://www.sql-server-helper.com/error-messages/msg-4104.aspx中的错误,但是由于我没有使用JOIN
或别名,这些都不能解决我的问题。因此,我不确定该怎么做。
我正在使用SQL Server 2017。
答案 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
)