MERGE - 根据WHEN MATCHED块中的逻辑单独更新列值

sio*_*orn -1 sql t-sql sql-server merge data-warehouse

今天早些时候,我问了这个问题并得到了我正在寻找的答案.现在我有一个后续问题:

我想要的是:

我希望MERGE比较每个列的值,每行,在针对源表中的相应值的目标表,并基于通过分离的逻辑的任何更新ORWHEN MATCHED AND块.

我怕我写的代码(如下图所示)将在列出的更新THEN UPDATE SET块,如果任何由分离的逻辑ORWHEN MATCHED AND块是真实的.

如果我的预感是正确的,您对如何重新编写代码以使其表现得像我希望它的行为有任何建议吗?

在此输入图像描述

Dam*_*ver 9

没有你的数据,也不想从图像中重新输入你的查询,我创建了一个我认为可以展示你想要的样本:

create table t (ID int not null,Col1 int null,Col2 int null)
create table s (ID int not null,Col1 int null,Col2 int null)

insert into t(ID,Col1,Col2) values (1,1,null),(2,null,2)
insert into s(ID,Col1,Col2) values (1,3,4),(2,5,6),(3,7,8)

;merge into t
using s
on t.ID = s.ID
when not matched then insert (ID,Col1,Col2) values (s.ID,s.Col1,s.Col2)
when matched then update
set Col1 = COALESCE(t.Col1,s.Col1),
Col2 = COALESCE(t.Col2,s.Col2)
;
select * from t
Run Code Online (Sandbox Code Playgroud)

结果:

ID          Col1        Col2
----------- ----------- -----------
1           1           4
2           5           2
3           7           8
Run Code Online (Sandbox Code Playgroud)

使用密钥COALESCE以避免更新列值(如果已经有一个值)(我认为这是你想要实现的)