Redshift中递归CTE应用报错:relation 'array_elements'不存在如何解决?
Redshift递归CTE报错的原因及修正方案
你的报错核心原因是Redshift要求递归CTE必须显式使用WITH RECURSIVE关键字,普通的WITH子句无法识别递归引用的CTE,所以会提示“array_elements不存在”。
修正后的完整代码
WITH RECURSIVE flattened_data AS ( SELECT benefit_id, rule_value FROM table1 ), array_elements AS ( SELECT benefit_id, TRIM(BOTH ' []"' FROM SPLIT_PART(rule_value, ',', 1)) AS element, 1 AS position, rule_value FROM flattened_data WHERE LENGTH(rule_value) > 2 UNION ALL SELECT ae.benefit_id, TRIM(BOTH ' []"' FROM SPLIT_PART(ae.rule_value, ',', ae.position + 1)) AS element, ae.position + 1, ae.rule_value FROM array_elements ae WHERE TRIM(BOTH ' []"' FROM SPLIT_PART(ae.rule_value, ',', ae.position + 1)) <> '' ) SELECT benefit_id, element FROM array_elements WHERE element <> '';
关键修改说明
- 添加
RECURSIVE关键字:这是Redshift递归CTE的强制要求,没有它数据库不会处理递归逻辑,导致引用自身CTE时失败 - 避免重复关联原表:把
rule_value带入递归层,不用每次递归都joinflattened_data,减少查询开销 - 优化终止条件:用
<> ''替代IS NOT NULL,因为TRIM后可能得到空字符串,能更精准地终止递归 - 过滤无效元素:最终查询去掉空元素,避免产生无意义的结果
Redshift递归CTE的基本规则
- 必须以
WITH RECURSIVE开头,不能省略RECURSIVE - 递归部分必须使用
UNION ALL(不能用UNION,会因去重中断递归逻辑) - 必须有明确的终止条件,防止无限递归
内容的提问来源于stack exchange,提问作者Anisa Daraputri
相关产品推荐
相关产品推荐

