2014-07-26 39 views
-4

我正在開發一個項目,幫助一個人找出巴士路線和巴士之間的轉換細節。我能夠找到路線,直到單個開關,但更多的是我無法做到這一點。請幫忙。如何找到最短的巴士路線時,有多個開關?

現在我的任務是如何從「Cantt」GO「SARAI」?使用相同的表格。

列Bus_Stop_Up的公交路線向上,Bus_Stop_Down的公交路線向下。

結果應該是像「Cantt(781) - >德瓦卡(764) - > Nehruplace(456) - >賴」 表的

詳細信息如下提及:

CREATE TABLE [dbo].[bustable] 
(
    [Sr] [int] NULL 
    [bus_no] [varchar](50) NULL, 
    [Bus_Stop_Up] [varchar](50) NULL, 
    [Bus_Stop_Up_Id] [int] NULL, 
    [Bus_Stop_Down] [varchar](50) NULL, 
    [Bus_Stop_Down_Id] [int] NULL, 
) 

表數據

||Sr | bus_no | Bus_Stop_Up | Bus_Stop_Down | Bus_Stop_Up_Id | Bus_Stop_Down_Id||    
------------------------------------------------------------------------------------------------------------- 
||1  | 781 | DWARKA  | NEW DELHI  | 1    | 1   || 
||2  | 781 | Airport  | Cantt   | 2    | 2   || 
||3  | 781 | Cantt  | Airport   | 3    | 3   || 
||4  | 781 | NEW DELHI | DWARKA   | 4    | 4   || 
||5  | 764 | DWARKA  | NEHRU PLACE  | 1    | 1   || 
||6  | 764 | NEHRUPLACE | DWARKA   | 2    | 2   || 
||7  | 456 | NEHRU PLACE | SARAI   | 1    | 1   || 
||8  | 456 | SARAI  | NEHRU PLACE  | 2    | 2   || 
+1

冷靜下來。不要大吼大叫。 –

+0

看看這篇文章: http://stackoverflow.com/questions/7105879/graph-problems-connect-by-nocycle-prior-replacement-in-sql-server –

+0

時間刷上你圖論。如果總停車次數不是很大:在內存中建立圖形,然後找到最短路徑。另請參見旅行商, – Richard

回答

0

我已經發布了這樣的事情一會兒前,在這裏: Graph problems: connect by NOCYCLE prior replacement in SQL server?

你會找到更多的技巧去這裏,其中I交叉張貼的問題:
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/32069da7-4820-490a-a8b7-09900ea1de69/is-there-a-nocycle-prior-replacement-in-sql-server?forum=transactsql

Graph

CREATE TABLE [dbo].[T_Hops](
    [UID] [uniqueidentifier] NULL, 
    [From] [nvarchar](1000) NULL, 
    [To] [nvarchar](1000) NULL, 
    [Distance] [decimal](18, 5) NULL 
) ON [PRIMARY] 

GO 




     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'A'    ,'E'    ,10.00000    ); 
     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'E'    ,'D'    ,20.00000    ); 
     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'A'    ,'B'    ,5.00000    ); 
     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'B'    ,'C'    ,10.00000    ); 
     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'C'    ,'D'    ,5.00000    ); 
     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'A'    ,'F'    ,2.00000    ); 
     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'F'    ,'G'    ,6.00000    ); 
     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'G'    ,'H'    ,3.00000    ); 
     INSERT INTO [dbo].[T_Hops]    ([UID]    ,[From]    ,[To]    ,[Distance])  VALUES    (newid()    ,'H'    ,'D'    ,1.00000    ); 

現在我可以查詢從點x的最佳連接點y這樣:

WITH AllRoutes 
(
    [UID] 
    ,[FROM] 
    ,[To] 
    ,[Distance] 
    ,[Path] 
    ,[Hops] 
) 
AS 
(
    SELECT 
     [UID] 
     ,[FROM] 
     ,[To] 
     ,[Distance] 
     ,CAST(([dbo].[T_Hops].[FROM] + [dbo].[T_Hops].[To]) AS varchar(MAX)) AS [Path] 
     ,1 AS [Hops] 
     FROM [dbo].[T_Hops] 
     WHERE [FROM] = 'A' 

    UNION ALL 


    SELECT 
     [dbo].[T_Hops].[UID] 
     --,[dbo].[T_Hops].[FROM] 
     ,Parent.[FROM] 
     ,[dbo].[T_Hops].[To] 
     ,CAST((Parent.[Distance] + [dbo].[T_Hops].[Distance]) AS [decimal](18, 5)) AS distance 
     ,CAST((Parent.[Path] + '/' + [dbo].[T_Hops].[FROM] + [dbo].[T_Hops].[To]) AS varchar(MAX)) AS [Path] 
     ,(Parent.[Hops] + 1) AS [Hops] 
    FROM [dbo].[T_Hops] 
INNER JOIN AllRoutes AS Parent 
      ON Parent.[To] = [dbo].[T_Hops].[FROM] 

) 

SELECT TOP 100 PERCENT * FROM AllRoutes 


/* 
WHERE [FROM] = 'A' 
AND [To] = 'D' 
AND CHARINDEX('F', [Path]) != 0 -- via F 
ORDER BY Hops, Distance ASC 
*/ 

GO 
+0

啊CTE,聰明! – Dai

+0

謝謝你的回覆.....好像我必須改變我的餐桌結構,因爲在781新德里到德瓦爾卡之間還有5個巴士站。這是我在單columne定義.... –

+0

@Quandary請再看看我的表,並建議。 –