交叉连接在 trino 中解除多个数组列的嵌套

问题描述 投票:0回答:1

我正在学习Trino,以及我在

cross join unnest
中使用数组时遇到的事情之一。然而,当我尝试使用 2 列时,结果对我来说没有多大意义。

这是第一个例子:

WITH dataset(department, users) AS (
    VALUES
        ('a', array[132,23,332]),
        ('d', array[10,20,30])
)
SELECT a.department, t.n AS channel_number, t.names FROM dataset a
CROSS JOIN UNNEST(users) WITH ORDINALITY as t(names,n)

这工作得很好,它横向分解数据集并为每行提供三行。

现在,我向其中添加另一列并尝试相同的取消嵌套:

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.names, x.nn AS channel_number2, x.atrs FROM dataset a
CROSS JOIN UNNEST(users) WITH ORDINALITY as t(names,n)
CROSS JOIN UNNEST(attrs) WITH ORDINALITY as x(atrs,nn)

这似乎给了我:

a 1 132 1 x
a 1 132 2 y
a 1 132 3 z
a 2 23 1 x
a 2 23 2 y
a 2 23 3 z
</snip>

但是,我一直在寻找:

a 1 132 1 x
a 2 23 2 y
a 3 332 3 z
d 1 10 1 k
a 2 20 2 q
a 3 30 3 l
</snip>

显然我正在做一些愚蠢的事情,但我无法弄清楚它可能是什么(这里是trino新手)

sql amazon-athena presto trino
1个回答
0
投票

Presto/Trino 允许一次取消嵌套多个数组列(按索引匹配元素,如果一个数组的元素少于另一个数组,则用

null
填充缺失值,请参阅文档中 UNNEST
示例) :

SELECT a.department, t.names, t.atrs FROM dataset a CROSS JOIN UNNEST(users, attrs) as t(names, atrs)
另请注意,可以使用简洁的语法:

SELECT a.department, t.names, t.atrs FROM dataset a , UNNEST(users, attrs) as t(names, atrs)
ATM 我没有可用的实例,所以不确定它是否可以与 

WITH ORDINALITY

 子句结合使用,但除此之外,这应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.