繁体   English   中英

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

[英]Merge: when not matched by source - update rows

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

那些在源表中不匹配的我希望更新它的位置,它说什么时候没有匹配来源类似的东西
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

这就是MERGE看起来的样子,我想我需要一些输出,它会给我不匹配的ID,所以我可以更新它们但不确定如何。

例如,这是PEOPLE中的行:

ID不是唯一的,它是组的ID

ID,名字,姓氏,UPD,格子

4345,JOHN,DOE,1 - 这个在'#PEOPLE中不存在(他的ID不存在),因为它是从早先的#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且CHANGE为null因为他的ID存在于PEOPLE和#PEOPLE中,但整行不匹配。

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 = 1
WHEN NOT MATCHED BY TARGET THEN
    INSERT (ID,NAME,SURNAME,UPD) 
    VALUES (source.ID ,source.NAME ,source.SURNAME,1)

WHEN NOT MATCHED BY SOURCE and target.UPD is not null and target.CHANGE is null THEN
  update set UPD = NULL,target.CHANGE  = CURRENT_TIMESTAMP

有任何想法吗?

阅读所有这些内容有点困难,但我可以看到你的表中没有任何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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM