Join BigQuery子查询有效联接

Join BigQuery子查询有效联接,join,google-bigquery,firebase-analytics,bigquery-standard-sql,Join,Google Bigquery,Firebase Analytics,Bigquery Standard Sql,我试图在BigQuery中分析firebase分析数据。我需要使用StandardSQL更新BigQuery中的表 我必须通过将表cart中的order\u标记添加到另一个表order来更新key='item\u id' 以下是查询: #standardSQL UPDATE `dataset.cart` c SET c.order_flag = true WHERE (SELECT value.string_value FROM UNNEST(c.event_dim.params

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

我必须通过将表
cart
中的
order\u标记添加到另一个表
order
来更新
key='item\u id'

以下是查询:

#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'))
但我得到了一个错误:

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


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

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

这是一种反模式,通常表示查询中存在错误。因为通常IN子句子查询不跨表关联

EXISTS子句通常在子查询中需要相关性,但在子查询中不需要相关性。 这很可能会奏效:

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

分为单独的列,以使查询优化器能够简单方便地进行优化

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

这是一种反模式,通常表示查询中存在错误。因为通常IN子句子查询不跨表关联

EXISTS子句通常在子查询中需要相关性,但在子查询中不需要相关性。 这很可能会奏效:

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')
分为单独的列,以使查询优化器能够简单方便地进行优化