MERGE语句仅更新不插入求助:基于员工ID同步table2数据
解决MERGE语句无法插入新行的问题
你的问题出在MERGE的匹配条件设置上:原语句的ON子句只关联了员工ID(SRC.table1ID = TGT.table2ID),所以只要table2里存在该员工ID的任意一行(不管table2Code是不是你指定的ValueToInsertOrUpdateCode),都会被判定为MATCHED,不会触发WHEN NOT MATCHED BY TARGET的插入逻辑。
要实现「员工ID对应指定code的行存在则更新,不存在则插入」的需求,需要把table2Code的条件移到ON子句中,让匹配逻辑精准定位到「员工ID+目标code」的组合行:
MERGE INTO dbo.table2 AS TGT USING (SELECT table1ID FROM dbo.table1) AS SRC -- 修改:把table2Code的条件加入匹配逻辑 ON SRC.table1ID = TGT.table2ID AND TGT.table2Code = 'ValueToInsertOrUpdateCode' WHEN MATCHED THEN UPDATE SET table2Value= 'ValueToInsertOrUpdateValue' WHEN NOT MATCHED BY TARGET THEN INSERT (table2Code, table2ID, table2Value) VALUES ('ValueToInsertOrUpdateCode', src.table1ID, 'ValueToInsertOrUpdateValue');
逻辑说明
- 当table2中存在「该员工ID + 目标code」的行时,触发
MATCHED分支,更新table2Value - 当table2中不存在「该员工ID + 目标code」的行时(不管该员工ID有没有其他code的行),触发
NOT MATCHED BY TARGET分支,插入新行
注意事项
建议给table2添加(table2ID, table2Code)的组合唯一约束,避免同一员工ID重复插入相同code的行,同时能保证MERGE操作的原子性。
内容的提问来源于stack exchange,提问作者brunas
相关产品推荐
相关产品推荐

