Snowflake执行SQL报unsupported subquery cannot be evaluated错误如何解决
错误原因
- 语法疏漏:原SQL中
LEFT CDTLS缺少JOIN关键字,不符合SQL语法规范。 - 核心逻辑问题:JOIN的ON关联条件中使用了依赖外部CDTLS表字段的相关嵌套子查询,绝大多数SQL执行引擎(如Spark SQL、Hive、Flink SQL等)都不支持在关联条件中执行这类需要逐行绑定外部表字段的子查询,因此抛出
unsupported subquery cannot be evaluated报错。
修复方案
提前预计算CUST_DETAILS表每条记录的生效结束日期,做成临时视图/子查询后再和TEMP表关联,避免在关联条件中嵌套子查询:
WITH CDTLS_WITH_END AS ( -- 提前计算每条客户明细的生效结束日期 SELECT CUSTOMER_HASH, EFFECTIVE_FROM, NAME, LEAD(EFFECTIVE_FROM, 1, DATE '9999-12-31') OVER ( PARTITION BY CUSTOMER_HASH ORDER BY EFFECTIVE_FROM ASC ) AS EFFECTIVE_TO FROM CUST_DETAILS ) SELECT TEMP.CUSTOMER_HASH, TEMP.EFFECTIVE_FROM, TEMP.EFFECTIVE_TO, CDTLS_WITH_END.NAME FROM TEMP LEFT JOIN CDTLS_WITH_END ON TEMP.CUSTOMER_HASH = CDTLS_WITH_END.CUSTOMER_HASH AND CDTLS_WITH_END.EFFECTIVE_FROM <= TEMP.EFFECTIVE_FROM AND CDTLS_WITH_END.EFFECTIVE_TO >= TEMP.EFFECTIVE_TO;
补充说明
如果你的业务逻辑允许TEMP的生效区间和CDTLS的生效区间只要有重叠就匹配,可以把关联条件的日期比较调整为CDTLS_WITH_END.EFFECTIVE_FROM < TEMP.EFFECTIVE_TO AND CDTLS_WITH_END.EFFECTIVE_TO > TEMP.EFFECTIVE_FROM,可根据实际业务规则调整。
内容的提问来源于stack exchange,提问作者user13033419
相关产品推荐
相关产品推荐

