I en rekursiv fråga tas termerna i söktabellen som används i en iteration bort och sedan upprepas frågan med de återstående posterna. I ditt fall betyder det att så snart du har bearbetat det första arrayelementet ("A") är det inte längre tillgängligt för ytterligare permutationer av arrayelementen. För att få in de "använda" elementen igen, måste du korskoppla med tabellen över arrayelement i den rekursiva frågan och sedan filtrera bort arrayelement som redan används i den aktuella permutationen (position(t.i in cte.combo) = 0
) och ett villkor för att stoppa iterationerna (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;