You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:03:27