无法更新与其自身连接的表

问题描述 投票:0回答:1

我正在尝试更新表格,但它给了我以下错误:

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

我应该使用此查询更新 housing_1,但更新函数必须链接到数据集。

UPDATE
  my-project-19297-401423.housing_analysis.housing_data
SET
  PropertyAddress = ifnull(housing_1.PropertyAddress,housing_2.PropertyAddress)
FROM
  my-project-19297-401423.housing_analysis.housing_data AS housing_1
JOIN
  my-project-19297-401423.housing_analysis.housing_data AS housing_2
ON
  housing_1.ParcelID = housing_2.ParcelID
AND
  housing_1.UniqueID_ <> housing_2.UniqueID_
WHERE
  housing_1.PropertyAddress is null;
google-bigquery
1个回答
0
投票

问题不在于连接,而在于查询为每个更新的数据集返回多个结果。请给原始表(将要更新)命名。

首先,生成一个虚拟表作为最小工作示例。

Test
是一个数据集。

CREATE OR REPLACE TABLE Test.housing AS
SELECT
  addr||tmp AS PropertyAddress,
  ParcelID,
  rand() UniqueID_
FROM UNNEST(SPLIT("A B C D E F G H"," ")) AS addr WITH OFFSET ParcelID,
  UNNEST(["",NULL]) AS tmp

然后我们使用

group by
从任何 ParcelID 中获取最佳地址,并且每个条目只有一行。在
WHERE
子句中,两个表的
ParcelID
必须匹配。当然,只更新缺失的条目:

org_table.PropertyAddress IS NULL
UPDATE
  Test.housing AS org_table
SET
  PropertyAddress = IFNULL(org_table.PropertyAddress,PropertyAddress_best_guess)
FROM (
  SELECT
    ParcelID,
    ANY_VALUE(PropertyAddress) AS PropertyAddress_best_guess
  FROM
    Test.housing
  GROUP BY
    ParcelID ) AS ref_tbl
WHERE
  org_table.PropertyAddress IS NULL
  AND org_table.ParcelID = ref_tbl.ParcelID
© www.soinside.com 2019 - 2024. All rights reserved.