我有以下雪花声明
WITH cte AS (
SELECT * FROM table1
),
use_cte_1 AS (
SELECT * FROM cte
),
cte AS (
SELECT * FROM table2
),
use_cte_2 AS (
SELECT * FROM cte
)
select * from use_cte_2;
据我所知,snowflake 仍然毫无怨言地执行此操作。我只是想知道这是否真的允许,我是否可以相信结果?
谢谢!
我尝试在雪花上跑步
更改代码以具有明确的值:
WITH cte AS (
SELECT
$1 as a
FROM values
('a')
), use_cte_1 AS (
SELECT
*
,'b' as b
FROM cte
), cte AS (
SELECT
$1 AS c
FROM values
('c')
), use_cte_2 AS (
SELECT
*
,'d' as d
FROM cte
)
select *
from use_cte_2;
我们得到:
这是有道理的,我希望这个 SQL 在重新定义符号时生成错误。但是您可以以有效的嵌套方式执行此操作,并且应该保持沉默..
因此这里使用范围
cte
:
WITH use_cte_1 AS (
with cte AS (
SELECT
$1 as a
FROM values
('a')
)
SELECT
*
,'b' as b
FROM cte
), use_cte_2 AS (
WITH cte as (
SELECT
$1 as a
FROM values
('c')
)
SELECT
*
,'d' as d
FROM cte
)
select *
from use_cte_2;
如果第一个块仍然位于顶层,则子 cte 没有作用域:
WITH cte AS (
SELECT
$1 as a
FROM values
('a')
), use_cte_1 AS (
SELECT
*
,'b' as b
FROM cte
), use_cte_2 AS (
WITH cte as (
SELECT
$1 as a
FROM values
('c')
)
SELECT
*
,'d' as d
FROM cte
)
select *
from use_cte_2;