PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL trouve toutes les combinaisons possibles (permutations) dans une requête récursive

Dans une requête récursive, les termes de la table de recherche utilisés dans une itération sont supprimés, puis la requête se répète avec les enregistrements restants. Dans votre cas, cela signifie que dès que vous avez traité le premier élément du tableau ("A"), il n'est plus disponible pour d'autres permutations des éléments du tableau. Pour récupérer ces éléments "utilisés", vous devez effectuer une jointure croisée avec la table des éléments du tableau dans la requête récursive, puis filtrer les éléments du tableau déjà utilisés dans la permutation actuelle (position(t.i in cte.combo) = 0 ) et une condition pour arrêter les itérations (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;