Snowflake使用CTE创建表

mik*_*wry 6 snowflake-cloud-data-platform

Snowflake 是否允许您创建一系列 CTE,然后最后将它们连接在一起以创建表格?

例如:

with CTE1 as ( SELECT * FROM TABLE1)
,CTE2 AS (SELECT * FROM TABLE2)
,CTE3 AS (SELECT * FROM TABLE3)

CREATE TABLE TABLE_NAME_HERE AS 
SELECT * FROM CTE1 AS 1
LEFT JOIN CTE2 AS 2 ON 1.KEY = 2.KEY
LEFT JOIN CTE3 AS 3 ON 1.KEY = 3.KEY
Run Code Online (Sandbox Code Playgroud)

我收到unexpected 'CREATE'.错误

Luk*_*zda 5

对的,这是可能的:

CREATE TABLE TABLE_NAME_HERE AS 
WITH CTE1 as ( SELECT * FROM TABLE1)
    ,CTE2 AS (SELECT * FROM TABLE2)
    ,CTE3 AS (SELECT * FROM TABLE3)
SELECT *     -- here should be explicit column list to avoid name duplication error
FROM CTE1 AS 1
LEFT JOIN CTE2 AS 2 ON 1.KEY = 2.KEY
LEFT JOIN CTE3 AS 3 ON 1.KEY = 3.KEY;
Run Code Online (Sandbox Code Playgroud)


Sim*_*rim 5

这是一个有趣的形式,因为 CTAS (CREATE TABLE AS) 形式是

CREATE TABLE <name> AS <select>
Run Code Online (Sandbox Code Playgroud)

SELECT 形式可以有一个 CTE,CTE 形式是

WITH <name> AS <select>
Run Code Online (Sandbox Code Playgroud)

CTE 也可以在子选择中,因为“它只是一个选择”,因此

SELECT <columns> 
FROM (
    WITH cte_1 AS (
         SELECT <columns>
         FROM table
    )
    SELECT <columns>
    FROM cte_1
)
Run Code Online (Sandbox Code Playgroud)

这说明了为什么 Lukasz 显示的形式是正确的,因为如果我们添加更多括号

CREATE TABLE name AS (
    WITH cte_1 AS (
        SELECT <columns>
        FROM table
    )
    SELECT <columns>
    FROM cte_1
)
Run Code Online (Sandbox Code Playgroud)