【问题标题】:BigQuery Update with Inner joinBigQuery 更新与内部联接
【发布时间】:2019-09-13 23:09:02
【问题描述】:

是否可以基于 JOIN 与 BigQuery 中的现有表对表执行更新?

此查询中没有任何双精度数

SELECT profile_id, count(*) as cnt 
FROM `instagram-tags-c67d8.sample_dataset.influence` 
GROUP BY profile_id HAVING cnt > 1

它也适用于

select a.profile_id, b.username
from  `instagram-tags-c67d8.sample_dataset.influence` AS a
inner join (
  SELECT
    DISTINCT profile_id, username 
FROM `instagram-tags-c67d8.sample_dataset.profile_id_lut`) AS b 
ON a.profile_id = b.profile_id
where a.username is null

现在我只有这个问题 UPDATE/MERGE 必须与每个目标行最多匹配一个源行

UPDATE
  `instagram-tags-c67d8.sample_dataset.influence` AS a
SET
  a.username = b.username
FROM (
  SELECT
    DISTINCT profile_id, username 
FROM `instagram-tags-c67d8.sample_dataset.profile_id_lut`) AS b
WHERE
  a.username IS NULL
  AND a.profile_id = b.profile_id

【问题讨论】:

  • 该错误似乎表明profile_id_lut 中有多个记录与influence 中的给定profile_id 匹配。
  • 是的,没错
  • 好的,那么您想如何处理该用例?也许从可用的usernames 中选择最大值或最小值?
  • 所以,数据库有很多行不同的用户名,但唯一的 profile_id SELECT profile_id, count(*) as cnt FROM ( SELECT DISTINCT profile_id, username FROM instagram-tags-c67d8.sample_dataset.profile_id_lut ) b GROUP BY profile_id HAVING cnt > 1; 因此,我认为最好的办法是删除旧用户名

标签: sql google-bigquery dml


【解决方案1】:

该错误似乎表明profile_id_lut 中有多个记录与表influence 中的给定profile_id 匹配。

您必须首先决定如何处理该用例。可能的选项包括:

  • 从源表profile_id_lut中删除重复记录
  • 从可用的usernames 中选择最大值或最小值
  • 选择profile_id最大或最小的用户名

最佳选择取决于您的功能用例,无法根据您问题中提供的信息进行评估...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2012-10-04
    • 2014-06-09
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多