Snowflake中如何在CTE内使用VALUES子句实现预期效果?
Snowflake中在CTE内使用VALUES子句的正确写法
Snowflake不支持像PostgreSQL那样直接在CTE的AS后使用VALUES子句,需要将VALUES包装在子查询中,以下两种写法都可以实现你要的效果:
写法一:在CTE定义时指定列名
WITH person (id, name) AS ( SELECT * FROM (VALUES (1, 'Ted'), (2, 'Bill')) ) SELECT * FROM person;
写法二:在子查询中指定列名
WITH person AS ( SELECT * FROM (VALUES (1, 'Ted'), (2, 'Bill')) AS t(id, name) ) SELECT * FROM person;
原因说明
Snowflake的CTE语法要求AS后面必须是完整的查询语句,而VALUES本身不属于完整查询,需要通过SELECT * FROM (...)将其转换为合法的数据源,这也是为什么单独执行SELECT * FROM (VALUES (...))可以正常运行的原因。
执行上述代码后,会得到与PostgreSQL中相同的输出:
id | name ----+------ 1 | Ted 2 | Bill
内容的提问来源于stack exchange,提问作者ori9mp
相关产品推荐
相关产品推荐

