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. Railsの無限の時間範囲に関する問題

    2. PotgreSQL-エラー:UTF8をエンコードするための無効なバイトシーケンス:0xeb 0x6e 0x74

    3. より大きなSQLファイルをMySQLにインポートする

    4. Oracleの複合キーを参照する