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

PostgreSQL finder alle mulige kombinationer (permutationer) i rekursiv forespørgsel

I en rekursiv forespørgsel fjernes termerne i søgetabellen, der bruges i en iteration, og derefter gentages forespørgslen med de resterende poster. I dit tilfælde betyder det, at så snart du har behandlet det første array-element ("A"), er det ikke længere tilgængeligt for yderligere permutationer af array-elementerne. For at få disse "brugte" elementer ind igen, skal du krydsjoin med tabellen over array-elementer i den rekursive forespørgsel og derefter filtrere array-elementer fra, der allerede er brugt i den aktuelle permutation (position(t.i in cte.combo) = 0 ) og en betingelse for at stoppe gentagelserne (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. Fejl ved konvertering af datatype varchar

  2. Hvordan kan jeg ændre flere tabeller på én gang i mysql?

  3. Find forbindelserne mellem databasemailkonti og databaseprincipper i SQL Server (T-SQL)

  4. Tilføjelse af mange (UDF'er) valideringsfunktioner til Oracle - hvilken metode kører hurtigst