AND和OR连接与BigQuery中嵌套的SELECT子句的组合

时间:2017-04-10 13:27:10

标签: sql google-bigquery

我们有一个动态UI查询构建器,它根据用户执行的操作构建BigQuery构造。查询就像(在单词中):

  • 查看过产品的用户
  • 查看过产品并将其添加到购物车的用户
  • 查看产品或将其添加到购物车并下订单的用户

为了支持这种查询,我们最初使用嵌套的SELECT子句。例如,上面的第二个查询在SQL中看起来与此类似:

function mouseCallback(src, evnt)
    handles = guidata(src);

    % Get the current point
    xyz = get(src, 'CurrentPoint');

    x = xyz(1,1);
    y = xyz(1,2);

    % Store x/y here or whatever you need to do
end

到目前为止,此工作正常。现在,查询"用户查看了产品或添加到购物车"因为这个错误而无法正常工作 - Semijoin expression must be a part of logical AND。为了使OR条件有效,我们愿意采用UNION的路径。因此查询将是这样的:

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'

问题是,如何支持AND和OR连词的组合?由于BigQuery中的UNION显然不能在WHERE子句中工作,我如何组合嵌套子查询? 具体来说,如何为上面的第三个项目符号点编写查询?

1 个答案:

答案 0 :(得分: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