2013-04-14 18 views
3

我正在嘗試構建一個簡單的路由查找器,它可以計算並存儲路由從A-B獲取的節點。一個由階段(節點及其下一個可能的中繼段)和一個route_stage表組成,它應該能夠存儲使用唯一路由ID計算出來的每條路由。Oracle中的SQL路由查找器 - 遞歸?

階段表

STAGEID START_STATION     NEXT_HOP_STATION     LENGTH 
---------- ------------------------------ ------------------------------ ---------- 
    1 Penzance      Plymouth        78 
    2 Plymouth      Exeter        44.8 
    3 Exeter       Taunton        36.6 
    4 Exeter       Salisbury       96.6 
    5 Salisbury      Basingstoke       38.2 
    6 Basingstoke     Southampton       52.7 
    7 Southampton     Poole         37 
    8 Poole       Weymouth        31.6 
    9 Taunton      Reading        99.5 
    10 Reading      Basingstoke       18 
    11 Reading      Paddington       40.9 
    12 Taunton      Bristol        48.8 
    13 Bristol      Bath         13 
    14 Bath       Swindon        37.5 
    15 Swindon      Reading        39.8 

Route_Stage表

ROUTEID STAGEID 
---------- ---------- 
    1   1 
    1   2 
    1   3 
    1   9 
    1   11 
    2   6 
    2   7 
    2   8 
    2   10 
    2   11 

對於以上的情況下,與在彭贊斯和橫樑,普利茅斯,埃克塞特,湯頓,讀ID 1點開始路線和終止於帕丁頓。理想情況下,我想創建一個存儲過程,該存儲過程接受開始和結束工作站的入口參數,以便內部代碼可以計算出合適的路線。

我已經看過遞歸,但有點迷路,因爲我不確定代碼在節點有多個潛在路徑時應該如何反應?它如何知道哪一個是正確的。

任何幫助,非常感謝。謝謝!

+0

你的意思是「正確的_一個」?例如,你是不是會遍歷所有的路線,或者你正在尋找最短的路線? – Sepster

+0

我不認爲以這種方式組織的數據將有助於解決問題。例如你需要一張提到哪個站位在哪條路線上的表格。交叉站也會派上用場。 –

回答

1

對於一個給定的起始位置,這將(我認爲......對不起,在iPad上手動輸入)爲每條路線提供一行,以便離開該起點。

SELECT 
    LEVEL as route_step, 
    t1.next_hop_station as next_station, 
    t1.stageid 

    FROM 
    stage t1 

    INNER JOIN stage t2 
    ON t2.start_station = t1.next_hop_station 

    START WITH 
    t1.start_station = 'your start station' 

    CONNECT BY 
    PRIOR t1.start_station = t1.next_hop_station 

所以,起始樁號彭贊斯:

Route_Step Next_Station StageID 
1.   Plymouth. 1 
2.   Exeter.  2 
3.   Taunton.  3 
4.   Reading.  9 
5.   Basingstoke. 10 
6.   Southampton 6 
7.   Poole.  7 
8.   Weymouth  8 
5.   Paddington. 11 
3.   Salisbury 4 
4.   Basingstoke. 5 
5.   Southampton. 6 
6.   Poole.  7 
7.   Weymouth. 8 

* excuse the .'s! 

包裝是用您獨特的起點站連接(以及從句去掉明確的開始,讓你從所有站點獲取途徑,而不僅僅是單站)會給你你需要爲您的輸出表(雖然按照前文的評論,我不知道使用的結構就是你,因爲你失去的相關細節):

SELECT 
    First_Stage.stageid as routeid, 
    q.stageid 

    FROM 
    (

     SELECT 
     LEVEL as route_step, 
     t1.next_hop_station as next_station, 
     t1.stageid 

     FROM 
     stage t1 

     INNER JOIN stage t2 
     ON t2.start_station = t1.next_hop_station 

     CONNECT BY 
     PRIOR t1.start_station = t1.next_hop_station 
    ) q 

    INNER JOIN stage as first_stage 
    ON first_stage.stageid = q.stageid 
    AND q.route_step = 1 
+0

感謝您的回覆。我試着運行第一段代碼,但是它在Oracle中返回消息'no rows selected'。我曾嘗試過幾個發車站,但仍然沒有歡樂。任何想法,爲什麼這可能是?乾杯。 – Reidacus

+0

@Andrew很抱歉,這行:_ON t1.start_station = t1.next_hop_station_應該讀取_ON t2.start_station = t1.next_hop_station_。在答案中已更正。 – Sepster

+0

非常感謝:) – Reidacus