在递归查询中,将删除迭代中使用的搜索表中的术语,然后对其余记录重复查询。在您的情况下,这意味着一旦处理完第一个数组元素(“
A”),就不再可用于数组元素的进一步排列。为了重新获得那些“使用过的”元素,您需要与递归查询中的数组元素表交叉联接,然后过滤掉当前排列中已使用的数组元素(
position(t.iin cte.combo) = 0)和停止迭代的条件(
ct <= 3)。
WITH RECURSIVE t(i) AS ( SELECt * FROM unnest('{A,B,C}'::char[])), 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, t WHERe ct <= 3 AND position(t.i in cte.combo) = 0) SELECt ARRAY(SELECT combo FROM cte ORDER BY ct, combo) AS result;


