合并:当与源不匹配时 - 更新行

时间:2017-07-07 17:29:17

标签: sql sql-server tsql sql-merge

我正在尝试找出合并函数,我必须更新目标表中存在的行,但这些行与源表中的行不匹配。

那些在源表格中不匹配的内容我想在行中更新,而不是像源{@ 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

有什么想法吗?

1 个答案:

答案 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);