2017-07-18 86 views
0

我試圖分析BigQuery中的firebase分析數據。我需要使用StandardSQL更新BigQuery中的表格。BigQuery子查詢高效加入

我必須更新表cart中的order_flag,其中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')) 

但我得到的錯誤:

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.

如何做到在這種情況下的有效的連接?

回答

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

成單獨列讓事情變得簡單和容易優化查詢優化。