Snowflake如何实现MERGE语句BY TARGET/SOURCE不匹配逻辑
Snowflake MERGE实现全量变更捕获的方案
Snowflake完全支持你需要的两种变更匹配逻辑,报错是因为其MERGE语法与SQL Server存在细微差异:WHEN NOT MATCHED默认就代表BY TARGET(源表有匹配、目标表无匹配)的场景,不允许显式添加BY TARGET修饰符,去掉该修饰即可正常运行。WHEN NOT MATCHED BY SOURCE(目标表有匹配、源表无匹配)是Snowflake原生支持的语法,无需调整。
标准语法模板
MERGE <目标表名> AS TARGET USING <源表/源查询结果> AS SOURCE ON <主键匹配条件,例:TARGET.id = SOURCE.id> -- 主键匹配成功:执行更新逻辑,对应SQL Server的WHEN MATCHED WHEN MATCHED THEN UPDATE SET TARGET.字段1 = SOURCE.字段1, TARGET.字段2 = SOURCE.字段2, TARGET.update_time = CURRENT_TIMESTAMP() -- 可选,记录更新时间 -- 源有、目标没有:执行插入逻辑,对应SQL Server的WHEN NOT MATCHED BY TARGET,无需加BY TARGET修饰 WHEN NOT MATCHED THEN INSERT ( 主键字段, 字段1, 字段2, create_time, update_time ) VALUES ( SOURCE.id, SOURCE.字段1, SOURCE.字段2, CURRENT_TIMESTAMP(), CURRENT_TIMESTAMP() ) -- 目标有、源没有:执行删除/软删除逻辑,对应SQL Server的WHEN NOT MATCHED BY SOURCE WHEN NOT MATCHED BY SOURCE THEN DELETE; -- 软删除场景替换为UPDATE SET TARGET.is_deleted = 1, TARGET.update_time = CURRENT_TIMESTAMP()
常用注意事项
- 可以为匹配逻辑添加额外判断条件,例如仅更新源表数据更新时间晚于目标表的记录:
WHEN MATCHED AND SOURCE.update_time > TARGET.update_time THEN UPDATE ... - 执行MERGE前需要确保源表的主键字段唯一,否则会触发重复键匹配的运行时错误
- 如果仅需要处理部分字段的变更,可以在UPDATE和INSERT语句中只指定要操作的字段,不需要覆盖全表字段
内容的提问来源于stack exchange,提问作者Kay B
相关产品推荐
相关产品推荐

