sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL vind alle mogelijke combinaties (permutaties) in recursieve zoekopdracht

Bij een recursieve query worden de termen in de zoektabel die in een iteratie worden gebruikt verwijderd en wordt de query vervolgens herhaald met de overige records. In jouw geval betekent dit dat zodra je het eerste array-element ("A") hebt verwerkt, deze niet meer beschikbaar is voor verdere permutaties van de array-elementen. Om die "gebruikte" elementen er weer in te krijgen, moet je cross-joinen met de tabel met array-elementen in de recursieve query en vervolgens array-elementen uitfilteren die al in de huidige permutatie worden gebruikt (position(t.i in cte.combo) = 0 ) en een voorwaarde om de iteraties te stoppen (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;



  1. Hoe Oracle-schemagrootte weer te geven met SQL-query?

  2. Hoeveel mensen registreren zich op de dag van de week

  3. PDO positionele en benoemde parameters als onderdeel van dezelfde voorbereide query?

  4. Zijn arrays geoptimaliseerd in jOOQ &PostgreSQL?