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')
放入单独的列中,使查询优化器的优化变得简单和容易。
我正在尝试在 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')
放入单独的列中,使查询优化器的优化变得简单和容易。