【问题标题】:Google BigQuery Error: UPDATE/MERGE must match at most one source row for each target rowGoogle BigQuery 错误:UPDATE/MERGE 必须与每个目标行最多匹配一个源行
【发布时间】:2019-12-17 16:34:20
【问题描述】:

我正在尝试通过比较(即更改的值)来更新引用新表的旧表。

我的查询如下:

UPDATE CogencyData.AUM
SET BeginBalanceBase = T1.BeginBalanceBase
FROM Cogency_Temp.AUM T1
LEFT OUTER JOIN CogencyData.AUM T2
ON T1.FundLongName = T2.FundLongName
AND T1.PeriodDate = T2.PeriodDate
WHERE COALESCE(T1.BeginBalanceBase, 0) <> COALESCE(T2.BeginBalanceBase);

但我收到以下错误:

UPDATE/MERGE must match at most one source row for each target row

我相信代码在 MySQL 中运行良好。我该如何解决这个问题?

【问题讨论】:

  • 注释掉前两行 (UPDATE/SET) 并替换为 SELECT T1.BeginBalanceBase as T1BBB, T2.BeginBalanceBase as T2BBB。有结果吗?
  • @rtenha 是的。结果我得到了两个值 - 也许这就是查询被混淆的原因?如何有效地更新这两个值?

标签: google-bigquery


【解决方案1】:

这个查询会给你同样的错误:

CREATE OR REPLACE TABLE temp.users AS (
   SELECT "1" id, 3 total
   UNION ALL SELECT "2", 2 total
   UNION ALL SELECT "3", 4 total
   UNION ALL SELECT "4", 5 total
)
;

UPDATE temp.users T0
SET total = T1.total + T2.total
FROM temp.users T1
LEFT OUTER JOIN temp.users T2
ON T1.id = T2.id
WHERE 1>0

这个查询修复了错误:

CREATE OR REPLACE TABLE temp.users AS (
   SELECT "1" id, 3 total
   UNION ALL SELECT "2", 2 total
   UNION ALL SELECT "3", 4 total
   UNION ALL SELECT "4", 5 total
)
;

UPDATE temp.users T0
SET total = T1.total + T2.total
FROM temp.users T1
LEFT OUTER JOIN temp.users T2
ON T1.id = T2.id
WHERE 1>0
AND T0.id = T1.id

诀窍是什么:最后一个 WHERE 子句 T0.id = T1.id 确保正在更新的表中的每一行只获得一次更新。

【讨论】:

    猜你喜欢
    • 2021-10-24
    • 2022-06-22
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    相关资源
    最近更新 更多