最短乘车路线查询示例(邹老大的。)

-- 最短乘车路线查询示例(邹老大的。) 
CREATE   TABLE  T_Line( 
ID      
nvarchar ( 10 ),   -- 公交线路号 
Station  nvarchar ( 10 ),   -- 站点名称 
Orders   int )            -- 行车方向(通过它反应每个站的上一个、下一个站) 
INSERT  T_Line  
SELECT  N ' 8路 '   ,N ' 站A ' , 1   UNION   ALL  
SELECT  N ' 8路 '   ,N ' 站B ' , 2   UNION   ALL  
SELECT  N ' 8路 '   ,N ' 站C ' , 3   UNION   ALL  
SELECT  N ' 8路 '   ,N ' 站D ' , 4   UNION   ALL  
SELECT  N ' 8路 '   ,N ' 站J ' , 5   UNION   ALL  
SELECT  N ' 8路 '   ,N ' 站L ' , 6   UNION   ALL  
SELECT  N ' 8路 '   ,N ' 站M ' , 7   UNION   ALL  
SELECT  N ' 20路 '  ,N ' 站G ' , 1   UNION   ALL  
SELECT  N ' 20路 '  ,N ' 站H ' , 2   UNION   ALL  
SELECT  N ' 20路 '  ,N ' 站I ' , 3   UNION   ALL  
SELECT  N ' 20路 '  ,N ' 站J ' , 4   UNION   ALL  
SELECT  N ' 20路 '  ,N ' 站L ' , 5   UNION   ALL  
SELECT  N ' 20路 '  ,N ' 站M ' , 6   UNION   ALL  
SELECT  N ' 255路 ' ,N ' 站N ' , 1   UNION   ALL  
SELECT  N ' 255路 ' ,N ' 站O ' , 2   UNION   ALL  
SELECT  N ' 255路 ' ,N ' 站P ' , 3   UNION   ALL  
SELECT  N ' 255路 ' ,N ' 站Q ' , 4   UNION   ALL  
SELECT  N ' 255路 ' ,N ' 站J ' , 5   UNION   ALL  
SELECT  N ' 255路 ' ,N ' 站D ' , 6   UNION   ALL  
SELECT  N ' 255路 ' ,N ' 站E ' , 7   UNION   ALL  
SELECT  N ' 255路 ' ,N ' 站F ' , 8  
GO  

-- 乘车线路查询存储过程 
CREATE   PROC  p_qry 
@Station_Start   nvarchar ( 10 ), 
@Station_Stop    nvarchar ( 10
AS  
SET  NOCOUNT  ON  
DECLARE   @l   int  
SET   @l = 0  
SELECT  ID,Station, 
Line
= CAST ( ' ( ' + RTRIM (ID) + ' ' + RTRIM (Station)  as   nvarchar ( 4000 )), 
Orders
= Orders, 
[ Level ] = @l  
INTO  #  FROM  T_Line 
WHERE  Station = @Station_Start  
WHILE   @@ROWCOUNT > 0   
AND   NOT   EXISTS ( SELECT   *   FROM  #  WHERE  Station = @Station_Stop
BEGIN  
SET   @l = @l + 1  
INSERT  #(Line,ID,Station,Orders, [ Level ]
SELECT   
Line
= a.Line + CASE  
WHEN  a.ID = b.ID  THEN  N ' -> ' + RTRIM (b.Station) 
ELSE  N ' ) ∝ ( ' + RTRIM (b.ID) 
+ N ' ' + RTRIM (b.Station)  END
b.ID,b.Station,b.Orders,
@l  
FROM  # a,T_Line b 
WHERE  a. [ Level ] = @l - 1  
AND (a.Station = b.Station  AND  a.ID  <> b.ID 
OR  a.ID = b.ID  AND
a.Orders
= b.Orders + 1  
OR  
a.Orders
= b.Orders - 1 )) 
AND   LEN (a.Line)  < 4000  
AND   PATINDEX ( ' %[ >] ' + b.Station + ' [-)]% ' ,a.Line) = 0  
END  
SELECT  N ' 起点站 ' = @Station_Start  
,N
' 终点站 ' = @Station_Stop  
,N
' 乘车线路 ' = Line + N ' ) '   
FROM  #  
WHERE   [ Level ] = @l   
AND  Station = @Station_Stop  
IF   @@ROWCOUNT   = 0   -- 如果未有可以到达的线路,则显示处理结果表备查 
SELECT   *   FROM  # 
GO  

-- 调用 
EXEC  p_qry N ' 站A ' ,N ' 站L '  
/*--结果 
起点站  终点站  乘车线路 
---------- ------------ ----------------------------------------------------------- 
站A    站L    (8路: 站A->站B->站C->站D->站J->站L) 
--
*/
 
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值