# 邹健写的公交车路线查询（包括转车近到远排列）。

之前做过，速度跟不上

-- 示例数据
create     table    Line(lineID    int ,state    nvarchar ( 10 ),orderid    int , primary     key (lineID,orderid))
insert    Line    select     1 , ' 鼓楼 '      , 1
union       all       select     1 , ' 新街口 ' , 2
union       all       select     1 , ' 汽车站 ' , 3
union       all       select     1 , ' 火车站 ' , 4
union       all       select     2 , ' 新街口 ' , 1
union       all       select     2 , ' 飞机场 ' , 2
union       all       select     2 , ' 天安门 ' , 3
union       all       select     3 , ' 天安门 ' , 1
union       all       select     3 , ' 石门坎 ' , 2
union       all       select     3 , ' 驾校 '      , 3
go

-- 查询的存储过程
create     proc    p_qry
@begin_state     nvarchar ( 10 ),
@end_state     nvarchar ( 10 )
as
set    nocount    on
declare     @l     int
set     @l = 0
select    lineID,line = cast ( ' ( ' + rtrim (lineID) + ' :    ' + rtrim (state)    as     varchar ( 8000 ))
,state,orderid
= orderid + 1 , level = @l ,gid = 1
into    #t    from    Line    where    state = @begin_state
while     @@rowcount > 0     and     not     exists ( select     *     from    #t    where    state = @end_state )
begin
set     @l = @l + 1
insert    #t(line,lineID,state,orderid, level ,gid)
select
line
= a.line + case
when    a.lineID = b.lineID
then     ' -> ' + rtrim (b.state)
else     ' )   =>   ( ' + rtrim (b.lineID) + ' :    ' + rtrim (b.state)
end ,
lineID
= b.lineID,state = b.state,orderid = b.orderid + 1 , @l ,
case     when    a.lineID = b.lineID    then    a.gid    else    a.gid + 1     end
from    #t   a,Line   b
where    a. level = @l - 1
and (
a.lineID
= b.lineID    and    a.orderid = b.orderid
or
a.state
= b.state    and    a.lineID <> b.lineID)
end
select    起点站 = @begin_state
,终点站
= @end_state
,转车次数
= gid
,经过站数
= case     when    gid < 3     then     @l     else     @l - gid + 2     end
,乘车线路
= line + ' ) '
from    #t    where     level = @l     and    state = @end_state
go

-- 调用
exec    p_qry    ' 鼓楼 ' , ' 火车站 '
exec    p_qry    ' 鼓楼 ' , ' 飞机场 '
exec    p_qry    ' 鼓楼 ' , ' 石门坎 '
go

-- 删除测试
drop     table    Line
drop     proc    p_qry

-------------------------------------

code   线路编号
name   线路名称
buscode   车次

stationcode   站编号
station   站名

code   线路编号
stationcode   站编号
seqnumber   某站在线路中的顺序
=======================================

1、根据起点站获得经过该站点的车次。
2、按序分析每路车次。
3、取得某个车次获得该站点的后续站点。
4、如果发现后续站点是B，就找到一条路径。记录该路径。并退出在本线路上的搜索。如果后续站点不是B，就继续分析后续站点的后续站点。直到该线路的终点站。
5、如果该线路的后续站点不存在B，则获得该线路的经过本站点的后续站点，重复过程1～4，换乘次数加1，如果换乘次数为4则退出该线路的搜索。
6、取得第二个车次，分析同上。
7、分析完所有路线，如果不存在，就提醒用户增加换乘次数，或者打的。如果存在按换乘次数从小到大排列换乘路线。

05-11
02-24 1万+

08-23 1万+
03-16 6034
10-20 1017
03-03 184
03-14 94
12-01 2万+
02-12 7758
07-31 260
09-07 2035
04-28 35
11-13 92
06-05 27
11-12 34

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助