BigQuery子查询高效加入

时间:2017-07-18 12:09:10

标签: join google-bigquery firebase-analytics standard-sql

我正在尝试分析BigQuery中的firebase分析数据。我需要使用StandardSQL更新BigQuery中的表。

我必须将表order_flag cart中的key = 'item_id'更新为order,方法是将其加入另一个表#standardSQL UPDATE `dataset.cart` c SET c.order_flag = true WHERE (SELECT value.string_value FROM UNNEST(c.event_dim.params) WHERE key = 'item_id') IN (SELECT (SELECT value.string_value FROM UNNEST(o.event_dim.params) WHERE key = 'item_id') FROM `dataset.order` o WHERE (SELECT key FROM UNNEST(o.event_dim.params) WHERE key = 'item_id') = (SELECT value.string_value FROM UNNEST(c.event_dim.params) WHERE key = 'item_id'))

以下是查询:

<form>

但我收到错误:

  

错误:不支持引用其他表的相关子查询,除非它们可以解相关,例如将它们转换为有效的JOIN。

如何在这种情况下进行有效的连接?

1 个答案:

答案 0 :(得分:2)

您的查询看起来有点奇怪,因为它具有带有相关子查询的IN子句(子查询同时使用a和c表)。

哪种反模式通常表示查询错误。因为通常IN子句子查询不是跨表关联的。

EXISTS子句通常需要子查询中的相关性,但不需要IN。 这最有可能发挥作用:

UPDATE
  `dataset.cart` c
SET
  c.order_flag=TRUE
WHERE
  (
  SELECT
    value.string_value
  FROM
    UNNEST(c.event_dim.params)
  WHERE
    key = 'item_id') IN (
  SELECT
    (
    SELECT
      value.string_value
    FROM
      UNNEST(o.event_dim.params)
    WHERE
      key = 'item_id')
  FROM
    `dataset.order` o
)

如果您决定切换到EXISTS,我建议存储

(SELECT
      value.string_value
    FROM
      UNNEST(o.event_dim.params)
    WHERE
      key = 'item_id')

进入单独的列,以便为查询优化器提供简单易用的优化。