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

Рекурсивно условие за спиране на CTE за цикли

WITH RECURSIVE paths AS (
    -- For simplicity assume node 1 is the start
    -- we'll have two starting nodes for data = 1 and 2
    SELECT DISTINCT
        src           as node
        , data        as data
        , 0           as depth
        , src::text   as path
        , ''          as edgeAdded   
    FROM edges
    WHERE
        src = 1

    UNION ALL

    SELECT DISTINCT
        edges.dst
        , edges.data
        , depth + 1
        , paths.path || '->' || edges.dst::text
        , edges.src::text || '->' || edges.dst::text
    FROM paths
    JOIN edges ON edges.src = paths.node AND edges.data = paths.data
    AND NOT paths.path LIKE '%' || edges.dst::text || '%' 
        -- AND eliminate loops?
)
SELECT * FROM paths;

Тук с условието AND NOT paths.path LIKE '%' || edges.dst::text || '%' ние избягваме задните ръбове, които биха довели до зацикляне.
http:/ /www.sqlfiddle.com/#!12/086ee/1



  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 B-Tree

  2. Задействане за актуализиране на текущата дата в Postgres 9

  3. postgresql уникално ограничение за всяко цяло число от две колони (или от масив)

  4. Вземете вложен обект в структура в gorm

  5. knex:какъв е подходящият начин за създаване на масив от резултати?