0

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

我必须通过将其加入另一个表来更新order_flag表。cartkey = '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'))

但我收到错误:

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

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

4

1 回答 1

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')

放入单独的列中,以使查询优化器保持简单和易于优化。

于 2017-07-18T17:25:26.933 回答