阵列上的 RedShift 自联接

RedShift self-join on array

提问人:Sam B 提问时间:11/9/2023 最后编辑:Sam B 更新时间:11/13/2023 访问量:44

问:

我在 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 不支持数组,因此研究具有挑战性......

提前致谢

SQL PostgreSQL 亚马逊网络服务 amazon-redshift

评论

0赞 SelVazi 11/9/2023
你能分享一下表的定义吗?
0赞 Sam B 11/9/2023
@SelVazi,我已经更新了问题,谢谢。

答:

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;