上一版演算法在實測中發現兩個關鍵問題:
line_count = 1 導致輸出值比實際換乘次數多 1。將初始化插入語句中的 line_count = 1 改為 line_count = 0,最終輸出的 line_count 即為真實換乘次數。
對 1 號線斷點進行修補:
-- 原始資料
SELECT 1, N'烈士陵園', 4 UNION ALL
-- SELECT 1, N'公園前', 6 -- 刪除斷點
-- SELECT 1, N'西門口', 7 -- 刪除斷點
SELECT 1, N'公園前', 5 UNION ALL -- 重新編號
SELECT 1, N'西門口', 6 UNION ALL
原則:同一 lineID 下 orderid 必須連續遞增 1,否則同線前進邏輯 A.current_orderid + A.flag = B.orderid 將無法匹配下一站。
查詢「廣州東」→「中大」得到四條有效路徑:
| 路徑 | 換乘次 | 途經站數 |
|---|---|---|
| 3{1.廣州東→2.體育西→3.珠江新城→4.客村}->2{5.客村→4.中大} | 1 | 5 |
| 3{1.廣州東→2.體育西}->1{3.體育西→4.烈士陵園→5.公園前}->2{3.公園前→4.中大} | 2 | 6 |
| 1{1.廣州東→2.體育中心→3.體育西→4.烈士陵園→5.公園前}->2{3.公園前→4.中大} | 1 | 6 |
| 1{1.廣州東→2.體育中心→3.體育西}->3{2.體育西→3.珠江新城→4.客村}->2{5.客村→4.中大} | 2 | 7 |
最優方案為第一條:換乘 1 次、途經 5 站(3 號線直達客村再換 2 號線)。
ROW_NUMBER() OVER (PARTITION BY lineID ORDER BY 原始序) 重新生成連續 orderid,寫入正式查詢表。#tb、#re,於 (lineID, orderid)、(state, lineID) 建立複合索引。next_orderid_forward、next_orderid_backward 欄位,避免迴圈中動態運算 current_orderid + flag。state_count <= (SELECT MIN(state_count) FROM #re WHERE flag=0) 條件,捨棄已超過當前最佳站數的路徑。修正 OrderID 連續性與換乘計數初始值後,演算法能穩定產出正確的最優換乘方案。實務部署時,建議將資料預處理、索引建立、迴圈邏輯封裝為預存程序,並配合應用層快取,滿足高併發查詢需求。