BigQuery 子查询高效连接

BigQuery Subqueries Efficient Join

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

我必须更新 order_flag in table cart where key = 'item_id' by joining it to another table 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'))

但我收到错误消息:

Error: Correlated subqueries that reference other tables are not supported unless they can be de-correlated, such as by transforming them into an efficient JOIN.

如何在这种情况下进行高效的加入?

你的查询看起来有点奇怪,因为它有 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')

放入单独的列中,使查询优化器的优化变得简单和容易。