sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL hittar alla möjliga kombinationer (permutationer) i rekursiv fråga

I en rekursiv fråga tas termerna i söktabellen som används i en iteration bort och sedan upprepas frågan med de återstående posterna. I ditt fall betyder det att så snart du har bearbetat det första arrayelementet ("A") är det inte längre tillgängligt för ytterligare permutationer av arrayelementen. För att få in de "använda" elementen igen, måste du korskoppla med tabellen över arrayelement i den rekursiva frågan och sedan filtrera bort arrayelement som redan används i den aktuella permutationen (position(t.i in cte.combo) = 0 ) och ett villkor för att stoppa iterationerna (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. Ansluta till två olika databaser i PHP?

  2. Är det möjligt att räkna alla rader med samma id med COUNT?

  3. Välj slumpmässig rad från en PostgreSQL-tabell med viktade radsannolikheter

  4. Oracle apex välj lista och dölj värden