Ido*_*ash 3 sql google-bigquery
假设我有类似以下大查询的简化查询:
WITH test AS (
SELECT 1 AS fieldA, 2 AS fieldB
)
SELECT fieldA, fieldB
FROM test
UNION ALL
SELECT fieldB, fieldA
FROM test;
Run Code Online (Sandbox Code Playgroud)
Big Query 会运行test
CTE 两次还是仅运行一次,然后在联合的两个部分之间共享数据?
我在发布此内容之前进行了搜索,我知道 CTE 查询仅适用于一个 SQL 语句。但在这里 - 只有一个语句使用相同的 CTE 两次,我找不到类似的东西。
当然,CTE 查询在现实生活场景中更为复杂,可能包含 ROW NUMBER 窗口函数和 JOINS。
多谢。
小智 7
对于子句 (CTE) 中的表,文档很清楚with
。
BigQuery 仅具体化递归 CTE 的结果,但不会具体化WITH 子句内的非递归 CTE 的结果。如果在查询中的多个位置引用非递归 CTE,则每次引用都会执行一次 CTE。
这可以通过添加带有 的列来测试rand()
。对于每种用途,它都有自己的价值。
WITH RECURSIVE test AS (
SELECT "normal" AS fieldA, 2 AS fieldB, RAND() AS R),
test_recursive AS
(SELECT "recursive" , 9, RAND() AS R
UNION ALL SELECT * FROM test_recursive
WHERE FALSE )
SELECT * FROM test
UNION ALL SELECT * FROM test
UNION ALL SELECT * FROM test
UNION ALL SELECT * FROM test
UNION ALL SELECT * FROM test_recursive
UNION ALL SELECT * FROM test_recursive
UNION ALL SELECT * FROM test_recursive
order by 1
Run Code Online (Sandbox Code Playgroud)
所有实际递归 CTE 都与随机 CTE 具有相同的值。因此,CTE仅计算一次。
此查询还显示,通过两行额外的行,每个 CTE 都可以实现。