雪花中具有未知匹配项的子查询,与列匹配

问题描述

我有几个要加入的表,其中一个可以有未知数量的匹配项,最多 6 个。每个匹配项都应作为初始查询中的行值返回。例如:

SELECT a.ID,a.match1,a.match2,a.match3,a.match4,a.match5,a.match6
FROM table1 a,(SELECT ID,match FROM table2 WHERE a.ID = table2.ID) b
WHERE a.ID = b.ID

这可能不是正确的语法,但希望它显示了我需要的东西。所以嵌套查询可以返回 1 个匹配或 5 个匹配。每个匹配应该是对应列名的值,即 a.match1 = 第一个匹配,b.match2 = 第二个匹配等。

如果我需要进一步解释,请告诉我。我知道这不是使用的最佳模式,但它是我被告知要使用的模式。

解决方法

SQL 不喜欢未知数量的列。

作为一个快速的技巧,您可以聚合数组中的所有匹配项,然后围绕它进行查询,将匹配项转换为预定义的(大量)列数。

像这样:

with data as (
select $1 id
from (values(1),(2))
),data2 as (
select $1 id,$2 match
from (values(1,'a1'),(1,'a2'),(2,'b1'),'b2'),'b3'))
)

select id,matches[0],matches[1],matches[2],matches[3]
from (
    select a.id,array_agg(match) matches
    from data a
    join data2 b
    on a.id=b.id
    group by 1
);

named aggregation