sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL najde všechny možné kombinace (permutace) v rekurzivním dotazu

V rekurzivním dotazu jsou odstraněny výrazy ve vyhledávací tabulce, které se používají v iteraci, a poté se dotaz opakuje se zbývajícími záznamy. Ve vašem případě to znamená, že jakmile zpracujete první prvek pole ("A"), již není k dispozici pro další permutace prvků pole. Chcete-li tyto „použité“ prvky vrátit zpět, musíte se křížově spojit s tabulkou prvků pole v rekurzivním dotazu a poté odfiltrovat prvky pole, které se již používají v aktuální permutaci (position(t.i in cte.combo) = 0 ) a podmínku pro zastavení iterací (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. ORA-01843:neplatný měsíc při vložení data do oracle

  2. Vytvoření formuláře pro POST do MySQL pomocí PDO správně?

  3. Počítání a řazení

  4. MySQL Match Fulltext