【问题标题】:Merge statement in SNOWFLAKE database on primary key error主键错误时 SNOWFLAKE 数据库中的合并语句
【发布时间】:2021-12-12 05:43:46
【问题描述】:

我对必须在我的场景中编写合并语句以将数据从表加载到维度表和事实表的方式感到困惑。

下面是合并语句,我试图将数据从 JSON 表加载到我的 DIM 产品表中,但加载的是 NULL 值。

我是否在合并时做错了什么,我是否应该不合并主键,而是合并诸如城市名称之类的字段

我在尝试将数据加载到事实表时遇到了同样的问题

有人可以帮忙吗?

merge into dim_product as a using (select productID, product from jsontable) as b
on b.productID = a.productID
when matched then update a.productID = b.productID
when not matched then insert (productID, product) values (b.productID, b.product));

下面是现有维度产品表

下面是示例 JSON,我尝试将新记录 Mango 合并并插入到我的 DIM 表中,并将 PRODUCTID 填充到我的事实表中

p>

下面是事实表

【问题讨论】:

  • 这取决于初始表结构(CREATE TABLE 语句)、精确数据(INSERT 语句)、MERGE 操作的确切结果的详细信息以及确切的行/值出乎意料,加上确切的预期结果。一个最小的可重现测试用例通常对于解决问题而不用猜测是至关重要的。尝试用 all 以上详细信息更新问题。
  • 嗨@JonArmstrong,谢谢你,我已经用示例图片更新了我的问题。
  • 你为什么要更新主键,当你找到匹配的行时,你应该更新产品,而不是产品ID。我认为关键是如何从 json 中提取数据,能否展示一下这些数据是什么样的以及如何提取?
  • 您的 json 表没有产品 id 列。请检查您的问题中的 SQL 和示例表,并确保它们是一致的
  • 您提供的查询与共享的示例数据不匹配。正如尼克提到的,JSON 数据中没有 productId。此外,没有“产品”列,因此“从 jsontable 中选择产品 ID,产品”也不正确,它应该包含描述字段。请解决您的问题。

标签: sql snowflake-cloud-data-platform primary-key fact-table merge-statement


【解决方案1】:

如果我们在源上没有 ProductID 并且只在 Dim_Product 中设置它,我们应该使用业务密钥。在您的情况下, ProductName 是业务密钥。解决方法很简单,当你做 MERGE 时,你应该使用 ProductName 作为键而不是 ProductID。

您的 MERGE 应该如下所示:

merge into dim_product as a using (select ProductName from jsontable) as b
on b.ProductName = a.ProductName
when not matched then insert (ProductName) values (b.ProductName));

如果您有更多描述产品的属性,则应在 MERGE 中对其进行修改。

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多