本主题与Copy missing rows from one table to another in sql server with stored procedure有关,但这次问题有点复杂。
我必须在不同的数据库(在同一台服务器上)使用相同的表。我需要将数据行从左数据库表传输到正确的数据库表,但我只想传输不在正确的数据库表中的行。
我的桌子有四个主键,见图像
我想用这样的东西
insert into [EXTERN_EPI6R2].[dbo].[tblBigTableReference]
select * from [EXTERN].[dbo].[tblBigTableReference]
where (
pkId not in (select pkId
from [EXTERN_EPI6R2].[dbo].[tblBigTableReference])
and PropertyName not in (select PropertyName
from [EXTERN_EPI6R2].[dbo].[tblBigTableReference])
and IsKey not in (select IsKey
from [EXTERN_EPI6R2].[dbo].[tblBigTableReference])
and [Index] not in (select [Index]
from [EXTERN_EPI6R2].[dbo].[tblBigTableReference])
)
但是,由于条件的堆叠在某种程度上是错误的,因此无法工作。
我正在使用SQL Server 2008 R2
答案 0 :(得分:4)
您的查询不正确,因为您可以在不同的行上匹配各种条件。
insert into [EXTERN_EPI6R2].[dbo].[tblBigTableReference]
select * from [EXTERN].[dbo].[tblBigTableReference] AS s
where NOT EXISTS
(
SELECT 1 FROM [EXTERN_EPI6R2].[dbo].[tblBigTableReference] AS d
WHERE d.pkId = s.pkId
AND d.PropertyName = s.PropertyName
AND d.IsKey = s.IsKey
AND d.[Index] = s.[Index] -- terrible column name
);
但这引出了一个问题 - 为什么所有这四个列都是关键的一部分? pkId
还不够吗?如果不是,那肯定有一个奇怪且不正确的名字。