【问题标题】:Merge Function limitation in snowflake雪花中的合并功能限制
【发布时间】:2019-10-10 05:19:51
【问题描述】:

我正在尝试将在 Oracle 中运行的合并函数转换为兼容 Snowflake。使用合并时,它限制了我的 where 子句。请让我知道是否有人可以提供帮助。

错误信息:Image

我正在使用具有以下条件的合并逻辑,它在意外的 where 子句中抛出错误。 (下面用粗体突出显示)

merge into INV_bas_SAP_ZIBP_SUPPLY b using inv_stg_dev.INV_stg_SAP_ZIBP_SUPPLY s
   on s.SCHEDULE_LINE_DATE = b.SCHEDULE_LINE_DATE
   when matched then
      update set b.col1 = s.col1, b.col2 = s.col2
      where col3=not null
   when not matched then
      insert (col1, col2) values (s.col1, s.col2);

【问题讨论】:

    标签: sql snowflake-cloud-data-platform snowsql


    【解决方案1】:

    请查看此网址https://docs.snowflake.net/manuals/sql-reference/sql/merge.html#matchedclause-for-updates-or-deletes

    您需要进行如下修改: 当匹配且 col3 不为 null 时,则更新集合 ...

    【讨论】:

      【解决方案2】:

      WHERE MATCHED 语句中的条件应写为:

      merge into INV_bas_SAP_ZIBP_SUPPLY b using inv_stg_dev.INV_stg_SAP_ZIBP_SUPPLY s
         on s.SCHEDULE_LINE_DATE = b.SCHEDULE_LINE_DATE
         when matched and col3=not null then
            update set b.col1 = s.col1, b.col2 = s.col2
         when not matched then
            insert (col1, col2) values (s.col1, s.col2);
      

      【讨论】:

      • 感谢二十一点的回复。请建议我是否在查询的 ON 子句中添加 where 条件,它是否与上述建议的条件相同。查询:在 s.SCHEDULE_LINE_DATE = b.SCHEDULE_LINE_DATE 和 col3=not null 上使用 inv_stg_dev.INV_stg_SAP_ZIBP_SUPPLY s 合并到 INV_bas_SAP_ZIBP_SUPPLY b 中,然后更新设置 b.col1 = s.col1,b.col2 = s.col2 不匹配时插入( col1, col2) 值 (s.col1, s.col2);
      • 如果您将 WHERE 子句条件 (col3=not null) 移动到 ON 子句,则 WHEN MATCHED 功能将保持不变但它也会影响 WHEN NOT MATCHED 功能。 目前WHEN NOT MATCHED 功能是 col3 为 NULL 的记录的超集,但在将 col3 is not null 移动到 ON 子句后,您将获得记录的子集。功能肯定会发生变化,这取决于您希望如何过滤数据的业务逻辑。
      最近更新 更多