W zapytaniu rekurencyjnym terminy w tabeli wyszukiwania, które są używane w iteracji, są usuwane, a następnie zapytanie powtarza się z pozostałymi rekordami. W twoim przypadku oznacza to, że po przetworzeniu pierwszego elementu tablicy („A”) nie jest on już dostępny dla dalszych permutacji elementów tablicy. Aby odzyskać te "używane" elementy, musisz połączyć się krzyżowo z tabelą elementów tablicy w zapytaniu rekurencyjnym, a następnie odfiltrować elementy tablicy już używane w bieżącej permutacji (position(t.i in cte.combo) = 0
) i warunek zatrzymania iteracji (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;