合并具有重复键的增量

时间:2019-08-21 21:13:07

标签: sql snowflake-data-warehouse

我试图在我们的Snowflake实例中执行到目标表的合并,在其中,源数据包含更改数据,该字段的字段表示源DML操作,即I = Insert,U = Update,D = Delete。

问题在于处理以下事实:日志(增量)源可能包含同一记录的多个更新。我构建的合并炸弹抱怨重复的密钥。

我一直在努力寻找解决方案,而没有在更新中加入GROUP BY和MAX之类的东西。我已经使用Oracle完成了类似的设置,并且MATCH上的AND子句就足够了。

MERGE INTO "DB"."SCHEMA"."TABLE" t
USING (
    SELECT * FROM "DB"."SCHEMA"."TABLE_LOG" 
    ORDER BY RECORD_TIMESTAMP ASC
) s ON t.RECORD_KEY = s.RECORD_KEY
WHEN MATCHED AND s.RECORD_OPERATION = 'D' THEN DELETE
WHEN MATCHED AND s.RECORD_OPERATION = 'U' THEN UPDATE
    SET t.ID=COALESCE(s.ID,t.ID),
        t.CREATED_AT=COALESCE(s.CREATED_AT,t.CREATED_AT),
        t.PRODUCT=COALESCE(s.PRODUCT,t.PRODUCT),
        t.SHOP_ID=COALESCE(s.SHOP_ID,t.SHOP_ID),
        t.UPDATED_AT=COALESCE(s.UPDATED_AT,t.UPDATED_AT)
WHEN NOT MATCHED AND s.RECORD_OPERATION = 'I' THEN
    INSERT (RECORD_KEY, ID, CREATED_AT, PRODUCT,
            SHOP_ID, UPDATED_AT)
    VALUES (s.RECORD_KEY, s.ID, s.CREATED_AT, s.PRODUCT,
            s.SHOP_ID, s.UPDATED_AT);

有没有一种方法可以重写上面的合并,使其按原样工作?

1 个答案:

答案 0 :(得分:0)

Snowflake文档在match子句中显示了AND谓词的能力,听起来像您尝试了此操作,并且由于重复而无法使用,对吗?

https://docs.snowflake.net/manuals/sql-reference/sql/merge.html#matchedclause-for-updates-or-deletes

甚至还有一个使用AND命令的示例:

merge into t1 using t2 on t1.t1key = t2.t2key
when matched and t2.marked = 1 then delete
when matched and t2.isnewstatus = 1 then update set val = t2.newval, status = t2.newstatus
when matched then update set val = t2.newval
when not matched then insert (val, status) values (t2.newval, t2.newstatus);

我认为您将必须获取每个键的“最后记录”并将其用作更新,或者串行地处理这些记录,这将非常慢...

要查看的另一件事是尝试查看是否可以对每个列应用last_value()函数,在该列中您可以按时间戳排序并在键上进行分区。如果您在嵌入式视图中执行此操作,则可能会起作用。

我希望这会有所帮助,我觉得这不会有太大帮助...丰富

更新:

我发现了以下内容:https://docs.snowflake.net/manuals/sql-reference/parameters.html#error-on-nondeterministic-merge

如果您在合并之前运行以下命令,我认为您会没事的(当然需要进行测试):

ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_MERGE=false;