PostgreSQL在递归查询

时间:2015-05-28 19:57:35

标签: sql postgresql combinations

输入是一个'n'长度的数组。我需要生成所有可能的数组元素组合,包括输入数组中元素较少的所有组合。

IN: j='{A, B, C ..}'
OUT: k='{A, AB, AC, ABC, ACB, B, BA, BC, BAC, BCA..}' 

重复,AB BA ..

我尝试过这样的事情:

WITH RECURSIVE t(i) AS (SELECT * FROM unnest('{A,B,C}'::text[])) 
,cte AS (
    SELECT i AS combo, i, 1 AS ct 
    FROM t 
  UNION ALL 
    SELECT cte.combo || t.i, t.i, ct + 1 
    FROM cte 
    JOIN t ON t.i > cte.i
) 
SELECT ARRAY(SELECT combo FROM cte ORDER BY ct, combo ) AS result;

它生成的组合没有重复......所以我需要以某种方式修改它。

1 个答案:

答案 0 :(得分:2)

在递归查询中,将删除搜索表中迭代中使用的术语,然后使用其余记录重复查询。在您的情况下,这意味着只要您处理完第一个数组元素(" A"),它就不再可用于数组元素的进一步排列。为了得到那些"使用"回到元素后,需要在递归查询中与数组元素表交叉连接,然后过滤掉当前排列(position(t.i in cte.combo) = 0)中已经使用的数组元素和停止迭代的条件({{1 }})。

ct <= 3