PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Điều kiện dừng CTE đệ quy cho các vòng lặp

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;

Ở đây với điều kiện AND NOT paths.path LIKE '%' || edges.dst::text || '%' chúng tôi đang tránh các cạnh sau sẽ dẫn đến một vòng lặp.
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. hiệu suất hàng loạt jdbc

  2. Gọi một hàm do người dùng xác định nằm trong postgres.c trong postgreSQL bằng cách sử dụng GUI được xác định bởi netbeans

  3. Cách thoát ký tự dấu chấm hỏi (?) Với Spring JpaRepository

  4. Division (/) không đưa ra câu trả lời của tôi trong postgresql

  5. Sự khác biệt về thứ tự các ký tự kiểu enum giữa PostgreSQL 9.0 và 9.1