PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL encontra todas as combinações possíveis (permutações) na consulta recursiva


Em uma consulta recursiva, os termos da tabela de pesquisa usados ​​em uma iteração são removidos e, em seguida, a consulta se repete com os registros restantes. No seu caso, isso significa que, assim que você processar o primeiro elemento da matriz ("A"), ele não estará mais disponível para outras permutações dos elementos da matriz. Para obter esses elementos "usados" de volta, você precisa fazer uma junção cruzada com a tabela de elementos de matriz na consulta recursiva e, em seguida, filtrar os elementos de matriz já usados ​​na permutação atual (position(t.i in cte.combo) = 0 ) e uma condição para parar as iterações (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;