Redshift中Super类型左外Unnest的替代实现方案咨询
直接用LEFT JOIN LATERAL UNNEST配合COALESCE就能解决这个问题,替代原来的隐式内连接,确保没有tags元素的行不会被过滤,逻辑和Athena/Presto里用默认空数组的思路一致。
修改后的SQL代码:
SELECT src.ac, src."day", src.region, i.resourcearn, t.key, t.value FROM ap_rs_meta_use_dev.getresources src -- 左连接展开resourcetagmappinglist,避免过滤主表行 LEFT JOIN LATERAL UNNEST(src.resourcetagmappinglist) AS i(resourcearn, tags) ON TRUE -- 用COALESCE把空/不存在的tags转为空数组,再左连接展开 LEFT JOIN LATERAL UNNEST(COALESCE(i.tags, '[]'::super)) AS t(key, value) ON TRUE
关键逻辑说明:
- 用
LEFT JOIN LATERAL UNNEST替换原来的逗号隐式连接:隐式连接等价于内连接,会过滤掉数组为空的行;而左连接横向展开(LATERAL)会保留主表所有行,即使嵌套数组为空。 COALESCE(i.tags, '[]'::super):当tags元素不存在或者为空数组时,将其替换为一个空的SUPER类型数组,这样UNNEST空数组时,对应的key和value会返回NULL,而非过滤整行。ON TRUE:横向连接不需要额外匹配条件,仅需展开数组即可。
效果验证:
- 对于你提供的示例数据(含tags的记录),会正常展开为2行,分别对应两个tag的key和value。
- 对于没有
tags元素的记录,主表的ac、day、region会保留,resourcearn(如果resourcetagmappinglist存在的话)也会保留,key和value则为NULL。
内容的提问来源于stack exchange,提问作者SimonB
相关产品推荐
相关产品推荐

