BigQuery:在临时表中

时间:2019-06-17 06:59:38

标签: sql google-bigquery standard-sql

我有一个很长的SQL查询,如下所示:

SELECT AVG(total_sum) AS avg_total_sum, COUNT(*) AS cnt
FROM (
  SELECT order_id, ...
  FROM `project.dataset.orders`
  WHERE order_id NOT IN (
    SELECT order_id
    FROM `project.dataset.orders`
    CROSS JOIN UNNEST(gifts) AS gifts
    WHERE ...
  )
)

这很好用,但我想通过将代码拆分到临时表中来简化代码,如下所示:

WITH t_ids AS (
  SELECT order_id
  FROM `project.dataset.orders`
  CROSS JOIN UNNEST(gift_details) AS gift_details
  WHERE ...
)

SELECT AVG(total_sum) AS avg_total_sum, COUNT(*) AS cnt
FROM (
  SELECT order_id, ...
  FROM `project.dataset.orders`
  WHERE order_id NOT IN t_ids
)

但这会导致以下错误:

  

语法错误:预期为“(”或关键字UNNEST,但标识符为“ t_ids”

我尝试添加括号UNNEST,但它似乎不适用于临时表。该问题如何解决?

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作

WITH t_ids AS (
    SELECT order_id
    FROM `project.dataset.orders`
    CROSS JOIN UNNEST(gifts) AS gifts
    WHERE ...+++
)
, cte as ( SELECT order_id, ...
          FROM `project.dataset.orders` t1
          join t_ids on t1.order_id=t_ids.order_id
) SELECT AVG(total_sum) AS avg_total_sum, COUNT(*) AS cnt from cte

您的WHERE order_id NOT IN t_ids这行是完全错误的,因为您没有选择任何ID,而是在where子句中使用了。顺便说一句,我已经通过使用join更改了它,因为您只需要两个表的通用ID,即可内部联接

答案 1 :(得分:0)

我刚刚注意到,我可以简单地将NOT IN t_ids替换为NOT IN (SELECT order_id FROM t_ids)

WITH t_ids AS (
  SELECT order_id
  FROM `project.dataset.orders`
  CROSS JOIN UNNEST(gift_details) AS gift_details
  WHERE ...
)

SELECT AVG(total_sum) AS avg_total_sum, COUNT(*) AS cnt
FROM (
  SELECT order_id, ...
  FROM `project.dataset.orders`
  WHERE order_id NOT IN (SELECT order_id FROM t_ids)
)

最后,代码既可以正常运行,又看起来不错!但是,如果有人有更简短的解决方案,我会很乐意接受。