再帰クエリでは、反復で使用される検索テーブル内の用語が削除され、残りのレコードでクエリが繰り返されます。あなたの場合、それは、最初の配列要素( "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;