PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL trova tutte le possibili combinazioni (permutazioni) nella query ricorsiva

In una query ricorsiva i termini nella tabella di ricerca utilizzati in un'iterazione vengono rimossi e quindi la query viene ripetuta con i record rimanenti. Nel tuo caso ciò significa che non appena hai elaborato il primo elemento dell'array ("A") non è più disponibile per ulteriori permutazioni degli elementi dell'array. Per recuperare quegli elementi "usati", è necessario unire in modo incrociato la tabella degli elementi dell'array nella query ricorsiva e quindi filtrare gli elementi dell'array già utilizzati nella permutazione corrente (position(t.i in cte.combo) = 0 ) e una condizione per interrompere le iterazioni (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;