2014-01-14 17 views
0

我下表在SQL:河網查詢

RiverID | RiverName  | RecipientID 
------------------------------------ 
0  | Atlantic Ocean | NULL 
1  | Mississippi | 0 
2  | Missouri  | 1 
3  | Yellowstone | 2 
4  | Bighorn  | 3 
5  | Wind   | 3 

RecipientID我的表中的意思是:如果它是NULL,則錶行表示海洋或閉合流域。如果RecipientID不爲NULL,那麼它就是一條河流,它將下游的另一條河流連接起來。

現在我想提出一個問題:給定一條河流,找到下游的所有河流,直到你到達海洋。例如:給定河「風」(RiverID = 5)查詢結果將顯示:

Wind - Yellowstone - Missouri - Mississippi - Atlantic Ocean. 

我怎樣寫在SQL這個查詢?

+0

序列中河流的最大數量是多少?你使用的是什麼數據庫? –

+0

它是否必須是純SQL?你可以使用TSQL/PLSQL(取決於哪個數據庫,正如Gordon所問)?如果你可以使用額外的編程語言,它可能會使問題變得更容易。 – CompuChip

+0

說實話,我會在這裏使用'CURSOR',因爲你不知道你需要多少次迭代。在我看來,它也會更具可讀性。 – XN16

回答

1

並非所有SQL數據庫都支持分層查詢。而當他們這樣做時,語法通常是不同的。

如果你的系統連接的最大數目,那麼你可以做你想做什麼聯接:

select r.RiverName, r1.RiverName, r2.RiverName, r3.RiverName, r4.RiverName, r5.RiverName 
from rivers r left outer join 
    rivers r1 
    on r.RecipientId = r1.RiverId left outer join 
    rivers r2 
    on r1.RecipientId = r2.RiverId left outer join 
    rivers r3 
    on r2.RecipientId = r3.RiverId left outer join 
    rivers r4 
    on r3.RecipientId = r4.RiverId left outer join 
    rivers r5 
    on r4.RecipientId = r5.RiverId ; 

這使得名字在五個單獨的列。您可以將它們連接在一起以將它們放在一個列中。

+0

系統中鏈接的最大數量目前爲10,但可能會隨着新數據的增加而增加添加到數據庫中。但我並不指望從任何河流開始到海洋將會有超過20個鏈接。使用的平臺是Microsoft SQLSERVER 2008。 – jirikadlec2