提问人:Sam B 提问时间:11/9/2023 最后编辑:Sam B 更新时间:11/13/2023 访问量:44
阵列上的 RedShift 自联接
RedShift self-join on array
问:
我在 Redshift 中有一个带有自引用的表,可以联接到以创建层次结构。ParentID
ProductID
基本结构(完整表为 c6k 记录,数组最多 90 个 ID):
CREATE TABLE sandbox.productmk2 (
productid integer ENCODE az64,
product character varying(500) ENCODE lzo,
parentid super
)
DISTSTYLE AUTO;
产品 ID | 产品 | 家长 ID |
---|---|---|
1 | 帽子 | [0] |
2 | 羊毛服装 | [0] |
3 | 帽子 | [1,2] |
ParentID
存储为 SUPER 类型并包含数组。
从网上的一些研究来看,有人建议使用 ANY 条件。但是,即使我再次将其转换为数组,我也会出现以下错误。
错误:op ANY/ALL(数组)需要右侧的数组,
SELECT a.ProductID, a.product, b.product as Parent
FROM sandbox.productmk2 A
JOIN sandbox.productmk2 b on b.productid = ANY(a.parentid)
预期输出
产品 ID | 产品 | 父母 |
---|---|---|
3 | 帽子 | 帽子 |
3 | 帽子 | 羊毛服装 |
将 更改为成功联接第一个 ID,因此数组看起来可以正确存储。ANY(a.parentid)
a.parentid[0]
关于操作员,我是否缺少一些东西,或者有更好的方法来解决这个问题?ALL
不幸的是,考虑到这是 Redshift 中一个相对较新的功能,而且我遇到的大多数文章都说 RS 不支持数组,因此研究具有挑战性......
提前致谢
答:
0赞
Lenroy Yeung
11/9/2023
#1
您似乎正在处理 Redshift 中的数组处理。不要使用 ANY 条件,而是尝试使用 UNNEST 来扩展数组,然后联接元素
SELECT a.ProductID, a.product, b.product as Parent
FROM sandbox.productmk2 a
JOIN sandbox.productmk2 b ON b.productid =
UNNEST(a.parentid)
评论
0赞
Sam B
11/13/2023
谢谢 Lenroy,但是我在尝试该方法时出现以下错误 ERROR:在“UNNEST”位置或附近出现语法错误 位置:125
0赞
Sam B
11/13/2023
#2
我已经找到了一种方法来获得一个有效的解决方案,尽管它远非优雅(我不喜欢加入 where 子句)。
如果有人能在这方面有所改进,我会非常渴望学习!
SELECT A.*, C.PRODUCT AS Parent
FROM sandbox.productmk2 AS A , a.parentid AS b, sandbox.productmk2 AS C
WHERE B = C.productid;
评论