0

私はDAGのトポロジカルな種類を見つけたいと思っていました。1つの再帰的クエリの出力を別の再帰的クエリに使用できますか?

create table topo(
v1 int, 
v2 int 
); 

Insert into topo values (1,3),(2,5),(3,4),(4,5),(4,6),(5,7),(6,5),(7,null) 

WITH RECURSIVE path(S,d) AS(
select t1.v1, 0 from topo t1 left outer join topo as t2 on t1.v1=t2.v2 
where t2.v2 IS null 
UNION ALL 
select distinct t1.v2, path.d + 1 from path inner join topo as t1 on 
t1.v1=path.S 
) 
select S from path group by S order by MAX(d); 

このコードは、グラフのトポロジカルな順序の出力を示します。今私は別の再帰的なクエリに別の頂点からのパスを見つけるためにこの出力を使用したい。

このコードで生成された出力を別の再帰的なクエリに使用できますか?私はそれを通常のやり方でしようとしていましたが、出力に誤りが見られました。

+0

既存の再帰CTEに新しいフィールドを追加するだけで、そのパスを取得できますか? – JNevill

+0

どのように?パスを3から7にしたいとします。別の再帰クエリを作成せずに可能ですか? – user3503711

答えて

1

パスを取得するために、既存の再帰SQLに追加:

WITH RECURSIVE path AS(
select 
    t1.v1 as start, 
    t1.v2 as end, 
    CAST(t1.v1 as VARCHAR(30)) as path 
    0 as depth 
from topo t1 
    left outer join topo as t2 on t1.v1=t2.v2 
where t2.v2 IS null 

UNION ALL 
select 
    path.start , 
    t1.v2 as end, 
    path.path || '>' || t1.v1,  
    path.d + 1 
from path 
    inner join topo as t1 on t1.v1=path.end 
) 
SELECT * FROM path 

はちょうどあなたがあなたの階層を横断して何が起こっているかを追跡するために複数のフィールドのカップルに加えます。 Startは最初のクエリから静的になります。これは出発点なので、すべてのレコードに対して1となります。 Endは現在作業しているノードです。 pathは新しいノードが見つかるたびにエンドノードを連結します。 depthはあなたがどのくらい横断したかを教えてくれます。