2017-07-18 13 views
0

BigQueryでfirebase分析データを分析しようとしています。 StandardSQLを使用してBigQueryのテーブルを更新する必要があります。BigQueryサブクエリ効率的な結合

私は別のテーブルorderにそれを結合することにより、テーブルcartkey = 'item_id'order_flagを更新する必要があります。

以下

クエリです:

#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

相関サブクエリ(サブクエリはaとcの両方のテーブルを使用)を持つIN句があるため、クエリが少し奇妙に見えます。

これは、反パターンの種類であり、通常はクエリで間違いを示します。通常、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 
) 

はその後、私は、クエリオプティマイザのために最適化するために、シンプルで簡単なものを維持するために別の列に

(SELECT 
     value.string_value 
    FROM 
     UNNEST(o.event_dim.params) 
    WHERE 
     key = 'item_id') 

を格納推薦EXISTS。

関連する問題