2017-04-10 5 views
0

ユーザーが行った操作に基づいてBigQuery構造を構築する動的UIクエリビルダがあります。クエリは(言葉で)のようなものです:製品に製品を見た BigQueryでのネストされたSELECT句とのAND結合とOR結合の組み合わせ

  • ユーザーを見た、カートに追加し

    • ユーザー
    • 製品を見たORカートにそれらを追加し、注文した
    • ユーザー

    このような種類のクエリをサポートするために、最初にネストされたSELECT句を使用しました。たとえば、上記の2番目のクエリは、SQLで次のようになります。

    SELECT email FROM users JOIN actions ON users.email = actions.user_id 
    WHERE email IN (SELECT email FROM users JOIN actions 
           ON users.email = actions.user_id 
           WHERE action = 'view_product') 
    AND action = 'add_product_to_cart' 
    

    これまでのところうまくいきます。今、このエラー(Semijoin expression must be a part of logical AND)のため、クエリ「商品を表示したユーザーまたはカートに追加したユーザー」は機能しません。作るOR条件が動作するために、我々は、このようになりますUNIONs.Theクエリのパスを取って喜んでいる:

    SELECT email FROM 
        (SELECT email FROM users JOIN actions 
        ON users.email = actions.user_id 
        WHERE action = 'view_product'), 
        (SELECT email FROM users JOIN actions 
        ON users.email = actions.user_id 
        WHERE action = 'add_product_to_cart') 
    

    の質問は、どのように両方の組み合わせをサポートしてANDとOR接続詞していますか? BigQueryのUNIONはWHERE節では動作しないため、ネストされたサブクエリをどのように組み合わせますか? 具体的には、上記の3番目の箇条書きのクエリを作成するにはどうすればよいですか?

  • 答えて

    0

    必ずuse standard SQLにしてください。次に、あなたが行うことができます。

    #standardSQL 
    SELECT email FROM users 
    WHERE (
        SELECT 
        (COUNTIF(action = 'view_product') > 0 OR 
        COUNTIF(action = 'add_product_to_cart') > 0) AND 
        COUNTIF(action = 'placed_order') > 0 
        FROM actions 
        WHERE email = user_id 
    ); 
    

    のBigQueryの標準SQL方言がmigration guideに詳述されている従来のSQLが行うよりも少ない制限を、持っています。

    +0

    これは、従来のSQLではすでに可能です。クエリ#2は本質的に同じものです。 UNIONは本質的にORを意味します。しかし、問題は、ネストされたサブクエリに対してANDとORを組み合わせることです。たとえば、商品を見たか、カートに追加して注文しました。 – Milind

    +0

    この編集が役立つかどうかを確認してください。私はこの問題が最初は従来のSQLの制限だと思った。 –

    関連する問題