Trino中Cross Join Unnest多数组列结果不符合预期的问题
Trino中按数组索引一一对应展开多数组的正确方法
你当前的写法会产生笛卡尔积,是因为对users和attrs分别执行了一次CROSS JOIN UNNEST——这相当于把第一个数组的每个元素,和第二个数组的每个元素全部配对,自然得不到按索引对应的结果。
要实现按数组索引一一对应展开,必须在同一个UNNEST子句里同时处理多个数组,Trino会自动按索引位置将对应元素配对(前提是两个数组长度一致)。
正确SQL示例
WITH dataset(department, users, attrs) AS ( VALUES ('a', array[132,23,332], array['x','y','z']), ('d', array[10,20,30], array['k','q','l']) ) SELECT a.department, t.n AS channel_number, t.user_id, t.attr_val FROM dataset a CROSS JOIN UNNEST(users, attrs) WITH ORDINALITY as t(user_id, attr_val, n)
补充说明
- 上述写法中,
UNNEST(users, attrs)会将每行的两个数组按索引一一展开,WITH ORDINALITY生成的n是两个数组共用的索引序号,确保元素按顺序配对。 - 如果存在数组长度不一致的情况,Trino默认会用
NULL填充较短数组的缺失元素。如果需要严格过滤掉数组长度不匹配的行,可以添加WHERE条件:
WITH dataset(department, users, attrs) AS ( VALUES ('a', array[132,23,332], array['x','y','z']), ('d', array[10,20], array['k','q','l']) ) SELECT a.department, t.n AS channel_number, t.user_id, t.attr_val FROM dataset a CROSS JOIN UNNEST(users, attrs) WITH ORDINALITY as t(user_id, attr_val, n) WHERE cardinality(users) = cardinality(attrs)
内容的提问来源于stack exchange,提问作者JohnJ
相关产品推荐
相关产品推荐

