Sql server SQL Server合并:“当源不匹配时”
我在staging表中有超过一百万行。每个月暂存表都会获取行,插入主表后,暂存表中的这些行将被删除 还有另一个名为allchanges的表,它跟踪对主表进行的所有更新,例如month1地址更改,month2-电话更改,因此所有更改都有2条记录,而主表只有一条更新记录 我在匹配时、目标不匹配时和源不匹配时使用合并Sql server SQL Server合并:“当源不匹配时”,sql-server,merge,Sql Server,Merge,我在staging表中有超过一百万行。每个月暂存表都会获取行,插入主表后,暂存表中的这些行将被删除 还有另一个名为allchanges的表,它跟踪对主表进行的所有更新,例如month1地址更改,month2-电话更改,因此所有更改都有2条记录,而主表只有一条更新记录 我在匹配时、目标不匹配时和源不匹配时使用合并 因为我一次只选择2行,所以当源不匹配时,在第二次迭代中,前2行的活动设置为零。我怎样才能克服这个问题???我不确定我是否完全理解你的问题。在第一次迭代中会发生什么?在第一次迭代中,由于主
因为我一次只选择2行,所以当源不匹配时,在第二次迭代中,前2行的活动设置为零。我怎样才能克服这个问题???我不确定我是否完全理解你的问题。在第一次迭代中会发生什么?在第一次迭代中,由于主控中没有记录,所以当目标和插入不匹配时,它会转到主控中。第二次迭代,它将获取下一个前2条记录,这两条记录在源不匹配的情况下。如果我不使用TOP n记录,就不会发生这种情况。
WITH NewAndChanged
AS (SELECT TOP 2 stg.[EmpName],
stg.[EmpNumber],
FROM staging AS stg
ORDER BY stg.[EmpNumber]
EXCEPT
SELECT TOP 2 mas.[EmpName],
mas.[EmpNumber],
FROM [Master] AS mas
ORDER BY mas.EmpNumber)
MERGE INTO [Master]
AS Target
USING NewAndChanged AS Source ON Target.EmpNumber = Source.EmpNumber
WHEN MATCHED AND (COALESCE (Target.EmpName, '') <> COALESCE (Source.EmpName, '')
) THEN UPDATE
SET Target.EmpName = Source.EmpName,
WHEN NOT MATCHED BY TARGET THEN INSERT ([EmpName], [EmpNumber])
WHEN NOT MATCHED BY SOURCE AND Target.Active = 1 THEN UPDATE
SET Active = 0
output $action as act;