PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL намира всички възможни комбинации (пермутации) в рекурсивна заявка

В рекурсивна заявка термините в таблицата за търсене, които се използват в итерация, се премахват и след това заявката се повтаря с останалите записи. Във вашия случай това означава, че веднага щом сте обработили първия елемент от масива ("A"), той вече не е достъпен за по-нататъшни пермутации на елементите от масива. За да върнете обратно тези „използвани“ елементи, трябва да извършите кръстосано свързване с таблицата на елементите на масива в рекурсивната заявка и след това да филтрирате елементите на масива, които вече са използвани в текущата пермутация (position(t.i in cte.combo) = 0 ) и условие за спиране на итерациите (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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL външен ключ не съществува, проблем с наследяването?

  2. Какво е PostgreSQL?

  3. Преобразуване на Postgresql база данни от SQL_ASCII, съдържаща смесени типове кодиране, в UTF-8

  4. Получаване на грешка при картографиране на PostgreSQL LTREE колона в хибернация

  5. Как да групирате по седмица в postgresql