Redshift中基于SUPER类型数组的自连接问题求助
问题解决:Redshift中SUPER类型数组的自连接层级查询
问题原因
Redshift的ANY/ALL运算符目前仅支持原生数组类型(如integer[]),你使用的ParentID是SUPER类型的数组,尽管存储的是数组结构,但无法直接被ANY识别,因此触发op ANY/ALL (array) requires array on right side错误。
正确解决方案
使用Redshift的UNNEST函数将SUPER类型的数组拆分为多行,再进行自连接,即可实现一个子节点关联多个父节点的需求。
最终SQL语句
SELECT a.productid, a.product, b.product AS parent FROM sandbox.productmk2 a -- 拆分SUPER数组为单独的父ID行 CROSS JOIN UNNEST(a.parentid) AS t(parent_id) -- 关联父节点信息,过滤无效的0值 JOIN sandbox.productmk2 b ON b.productid = t.parent_id::integer AND t.parent_id != 0;
结果说明
执行上述SQL后,会得到你期望的输出:
| ProductID | Product | Parent |
|---|---|---|
| 3 | Hats | Headwear |
| 3 | Hats | Woolwear |
补充说明
UNNEST(a.parentid)会把SUPER数组中的每个元素拆分成单独的行,比如[1,2]会拆分为两行,分别对应1和2;- 示例中存在
ParentID = [0]的无效父节点,通过AND t.parent_id != 0可以过滤掉这类不需要的关联; - 如果你的SUPER数组存储的是非整数类型,需根据实际情况调整
::integer的类型转换逻辑。
内容的提问来源于stack exchange,提问作者Sam B
相关产品推荐
相关产品推荐

