相互组合查询

时间:2018-08-22 14:36:54

标签: sql postgresql

我有一个名为“ X”的表,其中包含我的支持团队的列表。我们还有另一个名为“ Y”的表,该表具有用户列表。我在开发可能所有组合的输出时都遇到了问题,例如:

  • 表X(支持小组)= X1,X2
  • 表Y(要参加的用户)= Y1,Y2,Y3

我需要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

另一个例子:

squeeze

2 个答案:

答案 0 :(得分:2)

这是交叉连接的连接

 oOs.writeObject(object);

SqlFiddle.

答案 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,但是失败了。我敢肯定,有一种更优雅的方式来编写我的查询。)