En una consulta recursiva, los términos de la tabla de búsqueda que se utilizan en una iteración se eliminan y luego la consulta se repite con los registros restantes. En su caso, eso significa que tan pronto como haya procesado el primer elemento de la matriz ("A"), ya no estará disponible para más permutaciones de los elementos de la matriz. Para recuperar esos elementos "usados", debe unirse a la tabla de elementos de la matriz en la consulta recursiva y luego filtrar los elementos de la matriz que ya se usaron en la permutación actual (position(t.i in cte.combo) = 0
) y una condición para detener las iteraciones (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;