用于更改跟踪表的 Snowflake snowsql 合并语句 - 当目标/源不匹配时,不允许
Posted
技术标签:
【中文标题】用于更改跟踪表的 Snowflake snowsql 合并语句 - 当目标/源不匹配时,不允许【英文标题】:Snowflake snowsql merge statement for change tracking table - when not matched by target/source not allowed 【发布时间】:2021-09-07 17:15:05 【问题描述】:我正在尝试编写一个查询逻辑来捕获来自源的所有更改。
Merge 应该比较源和目标中的键并相应地处理数据。下面是一个示例,我们如何在 SQL Server 中实现这一点。
MERGE <target_table> [AS TARGET]
USING <table_source> [AS SOURCE]
ON <search_condition>
[WHEN MATCHED
THEN <merge_matched> ]
[WHEN NOT MATCHED [BY TARGET]
THEN <merge_not_matched> ]
[WHEN NOT MATCHED BY SOURCE
THEN <merge_matched> ];
在雪花中,我在尝试类似的事情时遇到错误, 错误 SQL 编译错误:第 7 行位置 17 的语法错误意外 'by'。位置 17 处的第 8 行语法错误意外'by'。
雪花中有没有办法处理“当与目标不匹配时”和“当与源不匹配时”逻辑?
谢谢。
【问题讨论】:
***.com/questions/66489537/… 【参考方案1】:队友建议的解决方法:
根据全连接定义MATCHED_BY_SOURCE
,并查看a.col 或b.col 是否为空:
merge into TARGET t
using (
select <COLUMN_LIST>,
iff(a.COL is null, 'NOT_MATCHED_BY_SOURCE', 'MATCHED_BY_SOURCE') SOURCE_MATCH,
iff(b.COL is null, 'NOT_MATCHED_BY_TARGET', 'MATCHED_BY_TARGET') TARGET_MATCH
from SOURCE a
full join TARGET b
on a.COL = b.COL
) s
on s.COL = t.COL
when matched and s.SOURCE_MATCH = 'NOT_MATCHED_BY_SOURCE' then
<DO_SOMETHING>
when matched and s.TARGET_MATCH = 'NOT_MATCHED_BY_TARGET' then
<DO_SOMETHING_ELSE>
;
【讨论】:
谢谢@Felipe Hoffa以上是关于用于更改跟踪表的 Snowflake snowsql 合并语句 - 当目标/源不匹配时,不允许的主要内容,如果未能解决你的问题,请参考以下文章