1. 程式人生 > >postgresql可達性問題 遞迴查詢

postgresql可達性問題 遞迴查詢

FLIGHTS
Origin:Destination:
AB
AC
BC
CD

CREATE TABLE flights(origin varchar(5),destination varchar(5));

INSERT INTO flights values('A','B'),('A','C'),('B','C'),('C','D');

找到所有(O->D),(出發點,起始點)

方法一(union):

需要找‘直達’+‘一次中轉’+’兩次中轉‘+.....

為求簡單隻寫了一次中轉(..:..)

方法二(recursion):


注:在oracle和sqlserver中recursive被省略。

step 0:reach被初始化為空集合;

step i:reach(x,y):-flights(x,y)

             reach(x,y):-flights(x,z),reach(z,y)

step end:當reach集合不再變化。