Trong một truy vấn đệ quy, các thuật ngữ trong bảng tìm kiếm được sử dụng trong một lần lặp sẽ bị loại bỏ và sau đó truy vấn lặp lại với các bản ghi còn lại. Trong trường hợp của bạn, điều đó có nghĩa là ngay sau khi bạn xử lý phần tử mảng đầu tiên ("A"), nó không còn khả dụng cho các hoán vị tiếp theo của các phần tử mảng. Để lấy lại các phần tử "đã sử dụng" đó, bạn cần kết hợp chéo với bảng các phần tử mảng trong truy vấn đệ quy và sau đó lọc ra các phần tử mảng đã được sử dụng trong hoán vị hiện tại (vị trí position(t.i in cte.combo) = 0
) và một điều kiện để dừng lặp lại (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;