Snowflake FLATTEN()函数疑问:数据源推断与行对齐机制
关于Snowflake FLATTEN()函数的两个技术问题
我正在学习Snowflake,FLATTEN()函数的工作方式有些违反直觉。以下是一个简单查询:
SELECT raw:first_name::STRING AS FName, raw:last_name::STRING AS LName, f.value::STRING AS Skill FROM tbl, TABLE(FLATTEN(raw:Skills)) f ORDER BY raw:id::INT LIMIT 5;
该查询可优雅地展开Skills数组,返回如下结果:
| FNAME | LNAME | SKILL |
|---|---|---|
| Flossy | Fasson | PS3 |
| Flossy | Fasson | Vlookup |
| Flossy | Fasson | Go |
| Celeste | Hubert | Tcl-Tk |
| Celeste | Hubert | Zines |
技术问询
- 在未显式指定表名的情况下,Snowflake是否会自动推断raw:Skills的数据源为tbl表?
- Snowflake如何将FLATTEN展开的数组与左表tbl的行进行对齐?该写法看似无连接键的交叉连接,为何未出现错误对齐?
问题1解答
是的,Snowflake会自动推断raw:Skills的数据源是tbl表。这是因为在FROM子句中,tbl是先声明的表,FLATTEN(raw:Skills)作为后续的表函数处于同一个FROM上下文,Snowflake会按作用域优先级,优先从前面的表中查找未指定表名的字段。你也可以显式写成TABLE(FLATTEN(tbl.raw:Skills)),效果完全一致,省略表名是Snowflake支持的简化写法。
问题2解答
这种写法看似是交叉连接,实际是隐式横向连接(Lateral Join),和普通交叉连接逻辑完全不同。
当FROM子句中用逗号分隔的表函数引用了前面表的列时,Snowflake会自动将其解析为横向连接。逻辑是:对左表tbl的每一行,单独执行一次FLATTEN展开该行的Skills数组,再把展开后的每个数组元素和原行的其他字段(FName、LName)关联对齐。
普通交叉连接是左表所有行和右表所有行做笛卡尔积,但横向连接是逐行处理、逐行关联,所以不会出现错误对齐——每一行展开的技能都只属于原行对应的用户。
内容的提问来源于stack exchange,提问作者Billie_H
相关产品推荐
相关产品推荐

