我正在学习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新手)
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
子句结合使用,但除此之外,这应该可以解决问题。