एक पुनरावर्ती क्वेरी में खोज तालिका में एक पुनरावृत्ति में उपयोग किए जाने वाले शब्द हटा दिए जाते हैं और फिर क्वेरी शेष रिकॉर्ड के साथ दोहराई जाती है। आपके मामले में इसका मतलब है कि जैसे ही आपने पहले सरणी तत्व ("ए") को संसाधित किया है, यह अब सरणी तत्वों के आगे के क्रमपरिवर्तन के लिए उपलब्ध नहीं है। उन "प्रयुक्त" तत्वों को वापस लाने के लिए, आपको पुनरावर्ती क्वेरी में सरणी तत्वों की तालिका के साथ क्रॉस-जॉइन करना होगा और फिर मौजूदा क्रमपरिवर्तन में पहले से उपयोग किए गए सरणी तत्वों को फ़िल्टर करना होगा (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;