我有一个名为“ X”的表,其中包含我的支持团队的列表。我们还有另一个名为“ Y”的表,该表具有用户列表。我在开发可能所有组合的输出时都遇到了问题,例如:
我需要X和Y之间的所有可能的PAIR组合
X1,Y1 ; X2,Y2
X1,Y1 ; X2,Y3
X1,Y2 ; X2,Y1
X1,Y2 ; X2,Y3
X1,Y3 ; X2,Y1
X1,Y3 ; X2,Y2
另一个例子:
答案 0 :(得分:2)
答案 1 :(得分:2)
我想对于未知数量的支持者,您需要一个递归查询。使用数组查找其他支持者/受支持者对。
with recursive pairs(supporter_array, supportee_array) as
(
select ('{' || s.id || '}')::varchar[], ('{' || o.id || '}')::varchar[]
from (select id, name from support_user order by id fetch first row only) s
cross join other_user o
union all
select p.supporter_array || s.id, p.supportee_array || o.id
from pairs p
join support_user s on s.id > ALL (p.supporter_array)
join other_user o on o.id <> ALL (p.supportee_array)
)
, scenarios as
(
select *, row_number() over (order by supporter_array, supportee_array) as scenario
from pairs
where array_length(supporter_array, 1) = (select count(*) from support_user)
)
select scenario, unnest(supporter_array) as supporter, unnest(supportee_array) as supportee
from scenarios
order by scenario, supporter;
上个月的演示:http://rextester.com/SUFW27556
(请耐心等待;这是我第一次使用PostgreSQL数组。我尝试使用多维数组,然后尝试使用ARRAY,但是失败了。我敢肯定,有一种更优雅的方式来编写我的查询。)