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

如何在Snowflake中结合Lateral Flatten与Join进行查询?

在Snowflake中结合Lateral Flatten与Join的正确写法

问题原因

你遇到的Error: invalid identifier 'R.STOCK_NUMBER'错误,是因为混合使用隐式逗号分隔的Lateral Flatten和显式JOIN时,Snowflake的查询解析顺序导致r.stock_number的作用域无法被正确识别。用逗号将table2 as r和lateral flatten连写后直接跟join table1,解析器会优先处理JOIN逻辑,此时r的关联关系还未被正确绑定。

解决方案

以下两种写法均可解决问题,推荐用子查询/CTE的方式,逻辑更清晰:

方案1:使用CTE预处理table2

先将table2经过Lateral Flatten过滤后的数据封装成CTE,再与table1关联:

WITH processed_table2 AS (
    SELECT DISTINCT r.stock_number
    FROM table2 as r
    LATERAL FLATTEN(input => r.line_items) as value
    WHERE r.created_date_time::date > TO_DATE('2023-12-04')
      AND value:reconciliationStatus::string != 'Matched'
      AND ARRAY_SIZE(r.payment_items) > 0
)
SELECT DISTINCT c.stocknumber
FROM table1 as c
JOIN processed_table2 as r ON r.stock_number = c.stocknumber
WHERE c.currentstatus = 'Sold'

方案2:使用子查询替代CTE

直接在JOIN中嵌套子查询处理table2的Flatten逻辑:

SELECT DISTINCT c.stocknumber
FROM table1 as c
JOIN (
    SELECT DISTINCT r.stock_number
    FROM table2 as r
    LATERAL FLATTEN(input => r.line_items) as value
    WHERE r.created_date_time::date > TO_DATE('2023-12-04')
      AND value:reconciliationStatus::string != 'Matched'
      AND ARRAY_SIZE(r.payment_items) > 0
) as r ON r.stock_number = c.stocknumber
WHERE c.currentstatus = 'Sold'

补充写法:调整JOIN顺序(可选)

如果想保留隐式Lateral Flatten的写法,可以先将table1与table2关联,再应用Lateral Flatten(注意过滤条件的位置):

SELECT DISTINCT c.stocknumber
FROM table1 as c
JOIN table2 as r ON r.stock_number = c.stocknumber
LATERAL FLATTEN(input => r.line_items) as value
WHERE c.currentstatus = 'Sold'
  AND r.created_date_time::date > TO_DATE('2023-12-04')
  AND value:reconciliationStatus::string != 'Matched'
  AND ARRAY_SIZE(r.payment_items) > 0

内容的提问来源于stack exchange,提问作者GThree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:46:27