我正在尝试找出合并函数,我必须更新目标表中存在的行,但这些行与源表中的行不匹配。
那些在源表格中不匹配的内容我想在行中更新,而不是像源{@ 1}}
这样的来源。这就是MERGE看起来的样子,我想我需要一些输出,它会给我ID不匹配所以我可以更新它们但不确定如何。
例如,这是PEOPLE中的行:
ID不是唯一的,它是群组的ID
ID,名字,姓氏,UPD,格子
4345,约翰,DOE,1 - 这个不存在(他的身份证不存在) '#PEOPLE,因为它是从早期的#PEOPLE合并中插入的,现在已经更改了
879,MARY,HON,1 - 这个存在于#PEOPLE
中
9875,CHRISTIAN,TROY,1 - 这个与行不匹配,但他的ID存在 在PEOPLE和#PEOPLE
所以从这个列表中我希望JOHN DOE保持原样,因为他的ID不会退出#PEOPLE而CHRISTIAN TROY会更新UPD将为NULL且CHANGE = CURRENT_TIMESTAMP但仅当UPD不为null且更改时为null,因为他的ID存在于PEOPLE和#PEOPLE中,但整行不匹配。
Update PEOPLE set UPD = null,target.CHANGE = CURRENT_TIMESTAMP where target.ID = source.ID and target.UPD is not null and target.CHANGE is null
有什么想法吗?
答案 0 :(得分:2)
阅读所有这些内容有点困难,但我可以看到你的桌面上没有任何FK,这就是为什么你必须在合并后进行更新。
你可以使用OUTPUT,但也许最简单的方法是进行这样的更新。如果匹配UPD = 2并且如果匹配并且插入UPD = 3 ..所以现在你有UPD = 1那些不匹配的,所以你看到#People中的ID是什么,你更新它们:
MERGE INTO PEOPLE WITH (HOLDLOCK) AS target
USING #PEOPLE AS source
on isnull(target.ID,'') = isnull(source.ID,'')
and isnull(target.NAME,'') = isnull(source.NAME,'')
and isnull(target.SURNAME,'') = isnull(source.SURNAME,'')
WHEN MATCHED THEN
UPDATE SET target.UPD = 2
WHEN NOT MATCHED BY TARGET THEN
INSERT (ID,NAME,SURNAME,UPD)
VALUES (source.ID ,source.NAME ,source.SURNAME,3)
;
UPDATE PEOPLE set UPD = null,CHANGE = CURRENT_TIMESTAMP where UPD = 1 and CHANGE is null and ID in (Select distinct ID from #PEOPLE);
UPDATE PEOPLE set UPD = 1 where (UPD =2 or UPD=3) and MB in (Select distinct MB from #PEOPLE);