You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数组,返回如下结果:

FNAMELNAMESKILL
FlossyFassonPS3
FlossyFassonVlookup
FlossyFassonGo
CelesteHubertTcl-Tk
CelesteHubertZines

技术问询

  1. 在未显式指定表名的情况下,Snowflake是否会自动推断raw:Skills的数据源为tbl表?
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 10:10:11