【问题标题】:BigQuery Update where WHERE condition has multiple rows (Limit Update)BigQuery 更新,其中 WHERE 条件具有多行(限制更新)
【发布时间】:2020-04-30 11:30:06
【问题描述】:

我在尝试将一个表中的数据与 Google BigQuery 中另一个表中的数据进行映射时遇到问题。为了简单起见: 我有dataTabledata_modelname, data_version, data_date 列。 mappingTable 包含 mapping_modelname, mapping_version, mapping_date

当我尝试这段代码时,

UPDATE dataTable
SET
    dataTable.data_date = mappingTable.data_date,
    dataTable.data_version = mappingTable.data_version

FROM mappingTable
WHERE 
    LOWER(data_modelname) IN (
    SELECT DISTINCT LOWER(mapping_modelname) AS distinctModel
    FROM mappingTable 
    WHERE mappingTable.data_version IS NOT NULL 
    )

我从 BigQuery 收到以下错误消息:

UPDATE/MERGE 必须与每个目标行最多匹配一个源行

select distinct 语句返回约 300 个不同模型的列表。因此,在考虑 WHERE 条件时,只有一个结果,例如 LOWER(data_modelname) 为 LOWER(ABC123)。

不幸的是,我的mappingTable 每个模型包含多个条目(重复),但我只想要找到的第一个条目。 Updating with LIMIT 1 没用。 我也尝试了这段代码,它的映射表条目较少,因此没有重复项。这运作良好。但是,当有多个型号名称时,它会返回相同的错误。

WHERE LOWER(data_modelname) = LOWER(mapping_modelname)

请您帮我将mappingTable.data_datemappingTable.data_version 中的mapping table 插入(更新)到data table where the data_modelname is mapping_modelname. 此外,能够使用一些通配符或正则表达式来映射模型名称会很棒,例如WHERE LOWER(data_modelname) IS LIKE '% mapping_modelname %'。

非常感谢。


编辑,新问题:

我现在遇到了另一个问题。相同的情况和表格,但我现在需要做的是更新字段data_date_Installed,其中模型和data_version_Installed 相同。所以在我的data-table 中有一个版本字段“3.4”和data_model "ABC123"。在mapping-table 中还有mapping_model "ABC123"mapping_version_Installed 中的许多不同版本,当然还有“3.4”和字段mapping_date_installed 中该版本的相应日期。 我试过这段代码,但它只匹配 1m 中的 88 个值。

UPDATE dataTable dt
    SET dt.data_date_installed = mapping_date_installed,
    FROM (SELECT ARRAY_AGG(mt LIMIT 1)[ORDINAL(1)].*
          FROM mappingTable mt
          WHERE mt.data_installed_version IS NOT NULL
          GROUP BY LOWER(mt.mapping_modelname)
         ) mt
    WHERE LOWER(mt.mapping_modelname) = LOWER(dt.data_modelname)
    AND
    data_version_Installed = mapping_version_Installed

实际上我可以排除表中的错误:两个表中的映射值正确且数据类型也正确(日期 = DATE 和版本 = STRING)。此外,将字符串与LIKE instead of = 进行比较也不会产生更多匹配值。 也许GROUP BY statement 省略了许多可能的安装版本。

如果您有什么建议,我非常高兴和感激。

编辑,已解决:

可以用简单的 SQL WHERE 来解决这个问题:

WHERE LOWER(mt.mapping_model) = LOWER(FINAL_modelName)
AND
data_date_installed = mt.mapping_date_installed

【问题讨论】:

    标签: sql google-bigquery sql-update


    【解决方案1】:

    使用聚合获取每个LOWER(model_name) 的一行:

    UPDATE dataTable dt
        SET dt.data_date = mt.data_date,
            dt.data_version = mt.data_version
        FROM (SELECT ARRAY_AGG(mt LIMIT 1)[ORDINAL(1)].*
              FROM mappingTable mt
              WHERE mt.data_version IS NOT NULL
              GROUP BY LOWER(mt.mapping_modelname)
             ) mt
        WHERE LOWER(mt.mapping_modelname) = LOWER(dt.data_modelname)
    

    【讨论】:

      【解决方案2】:

      是的 Array_AGG 会起作用,主要是当我们更新一个表但在加入两个表后从映射器获取多个值时。

      【讨论】:

      猜你喜欢
      • 2012-08-28
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多