Bei einer rekursiven Abfrage werden die Begriffe in der Suchtabelle, die in einer Iteration verwendet werden, entfernt, und die Abfrage wird dann mit den verbleibenden Datensätzen wiederholt. Das bedeutet in Ihrem Fall, sobald Sie das erste Array-Element ("A") verarbeitet haben, steht es für weitere Permutationen der Array-Elemente nicht mehr zur Verfügung. Um diese "benutzten" Elemente wieder einzufügen, müssen Sie in der rekursiven Abfrage eine Kreuzverbindung mit der Tabelle der Array-Elemente herstellen und dann Array-Elemente herausfiltern, die bereits in der aktuellen Permutation verwendet werden (position(t.i in cte.combo) = 0
) und eine Bedingung zum Stoppen der Iterationen (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;