雪花cte重新定义

问题描述 投票:0回答:1

我有以下雪花声明

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 仍然毫无怨言地执行此操作。我只是想知道这是否真的允许,我是否可以相信结果?

谢谢!

我尝试在雪花上跑步

sql snowflake-cloud-data-platform common-table-expression
1个回答
0
投票

更改代码以具有明确的值:

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;

© www.soinside.com 2019 - 2024. All rights reserved.