我有一个很长的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
,但它似乎不适用于临时表。该问题如何解决?
答案 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)
)
最后,代码既可以正常运行,又看起来不错!但是,如果有人有更简短的解决方案,我会很乐意接受。