0

我想找到DAG的拓撲排序。我們可以將一個遞歸查詢的輸出用於另一個遞歸查詢嗎?

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會告訴你你走遍了多遠。