此时,源表和目标表具有三列'ID'、'ST'和' ADD '。'ADD'允许空值
在中使用SQL Server merge*语句我要将在源表中所做的更改放到目标中。要求:
1.如果*ID在源中可用,但在目标中不可用,则在目标中插入新行
1.对于源和目标中可用的任何ID,如果仅 ADD在源中更改,则在目标中插入新行。即,如果 ID=2 的 ADD 更改了两次,则目标中 ID=2 将有三行(原始行+两次更改),因为我们每次都插入新行
1.对于源和目标中均可用的任何ID,如果仅 ST 更改了源中的 * ST ,则应更新目标中匹配 ID 的所有行中 ST 的修改值
1.对于源和目标中均可用的任何 ID,如果源中的 ST 和 ADD 均发生了更改,则应为新 ADD插入新行,并应使用更新的 ST 值更新该 ID 的所有旧行
我可以通过SQL Server合并实现这一点吗?如果不能,我们有什么替代方案?
2条答案
按热度按时间dtcbnfnu1#
尝试将st作为唯一列合并并更新ID,添加具有多个记录列
ux6nzvsh2#
MERGE
需要主键,您必须以行一对一匹配的方式连接两个表。否则,您将得到类似于以下内容的错误:MERGE语句试图多次更新或删除同一行.当目的行与多个源行匹配时,会发生这种情况. MERGE语句不能多次更新/删除目的表得同一行.请改进ON子句以确保目的行最多与一个源行匹配,或使用GROUP BY子句对源行进行分组.
第二个要求实际上意味着该键由两列
(ID, ADD)
组成,并且MERGE
语句应该连接这两列:此查询几乎完成了您所需的工作。
ST
值的更新与您所描述的不完全相同。1.对于源和目标中均可用的任何ID,如果源中只有ST更改,则应在目标中匹配ID的所有行中更新ST的修改值
由于上面的查询在
(ID, ADD)
上联接,因此ST
的修改值不会在target中匹配的ID
的所有行中更新,而是在具有匹配的ID
和ADD
的一行中更新。同样,第四个要求也不是您想要的那样。新行将被插入,但是具有相同
ID
的旧行都不会被更新。对于
ST
的这种更新,你需要一个单独的UPDATE
语句,或者单独的INSERT
和UPDATE
语句,而不需要MERGE
。