用于更改跟踪表的 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 合并语句 - 当目标/源不匹配时,不允许的主要内容,如果未能解决你的问题,请参考以下文章

用于保存对审计跟踪表的更改的 Sql 触发器

Snowflake - 读取实现的架构

使用 Node.js 跟踪对 MySQL 表的更改

Snowflake中的数据库更改检测过程

多表 Debezium 连接器是不是保证跨更改跟踪表的排序?

Flyway 与 Git 集成并连接到 Snowflake