2017-04-10 118 views
0

我們有一個動態UI查詢構建器,它基於用戶完成的操作構建BigQuery構造。查詢像(大寫):誰瀏覽過的產品 AND和OR與BigQuery中嵌套SELECT子句的組合

  • 用戶誰瀏覽過的產品,並將它們添加到購物車

    • 用戶
    • 用戶誰瀏覽過的產品或將它們添加到購物車,下訂單

    爲了支持這種查詢,我們最初使用了嵌套的SELECT子句。例如,上面的第二個查詢在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子句,因此如何組合嵌套子查詢? 具體而言,如何爲上面的第三個項目符號點編寫查詢?

  • 回答

    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方言有限制較少比傳統SQL確實,這是在migration guide詳細。

    +0

    這在傳統SQL中已經可以實現。查詢#2本質上是一樣的,我猜。 UNION本質上是指OR。但是,問題在於將嵌套子查詢與AND和OR相結合,例如,查詢用於查詢產品或將其添加到購物車並放置訂單__的用戶。 – Milind

    +0

    看看這個編輯是否有幫助。我認爲這個問題起初只是傳統的SQL限制。 –