В рекурсивна заявка термините в таблицата за търсене, които се използват в итерация, се премахват и след това заявката се повтаря с останалите записи. Във вашия случай това означава, че веднага щом сте обработили първия елемент от масива ("A"), той вече не е достъпен за по-нататъшни пермутации на елементите от масива. За да върнете обратно тези „използвани“ елементи, трябва да извършите кръстосано свързване с таблицата на елементите на масива в рекурсивната заявка и след това да филтрирате елементите на масива, които вече са използвани в текущата пермутация (position(t.i in 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;