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

    之前做过,速度跟不上

None.gif -- 示例数据
None.gif
create     table    Line(lineID    int ,state    nvarchar ( 10 ),orderid    int , primary     key (lineID,orderid))
None.gif
insert    Line    select     1 , ' 鼓楼 '      , 1
None.gif
union       all       select     1 , ' 新街口 ' , 2
None.gif
union       all       select     1 , ' 汽车站 ' , 3
None.gif
union       all       select     1 , ' 火车站 ' , 4
None.gif
union       all       select     2 , ' 新街口 ' , 1
None.gif
union       all       select     2 , ' 飞机场 ' , 2
None.gif
union       all       select     2 , ' 天安门 ' , 3
None.gif
union       all       select     3 , ' 天安门 ' , 1
None.gif
union       all       select     3 , ' 石门坎 ' , 2
None.gif
union       all       select     3 , ' 驾校 '      , 3
None.gif
go
None.gif
None.gif
-- 查询的存储过程
None.gif
create     proc    p_qry
None.gif
@begin_state     nvarchar ( 10 ),
None.gif
@end_state     nvarchar ( 10 )
None.gif
as
None.gif
set    nocount    on
None.gif
declare     @l     int
None.gif
set     @l = 0
None.gif
select    lineID,line = cast ( ' ( ' + rtrim (lineID) + ' :    ' + rtrim (state)    as     varchar ( 8000 ))
None.gif,state,orderid
= orderid + 1 , level = @l ,gid = 1
None.gif
into    #t    from    Line    where    state = @begin_state
None.gif
while     @@rowcount > 0     and     not     exists ( select     *     from    #t    where    state = @end_state )
None.gif
begin
None.gif
set     @l = @l + 1
None.gif
insert    #t(line,lineID,state,orderid, level ,gid)
None.gif
select    
None.gifline
= a.line + case
None.gif
when    a.lineID = b.lineID
None.gif
then     ' -> ' + rtrim (b.state)
None.gif
else     ' )   =>   ( ' + rtrim (b.lineID) + ' :    ' + rtrim (b.state)
None.gif
end ,
None.giflineID
= b.lineID,state = b.state,orderid = b.orderid + 1 , @l ,
None.gif
case     when    a.lineID = b.lineID    then    a.gid    else    a.gid + 1     end
None.gif
from    #t   a,Line   b
None.gif
where    a. level = @l - 1
None.gif
and (
None.gifa.lineID
= b.lineID    and    a.orderid = b.orderid
None.gif
or    
None.gifa.state
= b.state    and    a.lineID <> b.lineID)
None.gif
end
None.gif
select    起点站 = @begin_state
None.gif,终点站
= @end_state
None.gif,转车次数
= gid
None.gif,经过站数
= case     when    gid < 3     then     @l     else     @l - gid + 2     end
None.gif,乘车线路
= line + ' ) '    
None.gif
from    #t    where     level = @l     and    state = @end_state
None.gif
go
None.gif
None.gif
-- 调用
None.gif
exec    p_qry    ' 鼓楼 ' , ' 火车站 '
None.gif
exec    p_qry    ' 鼓楼 ' , ' 飞机场 '
None.gif
exec    p_qry    ' 鼓楼 ' , ' 石门坎 '
None.gif
go
None.gif
None.gif
-- 删除测试
None.gif
drop     table    Line
None.gif
drop     proc    p_qry
None.gif


说得比较合理的资料
-------------------------------------
线路表:
code   线路编号
name   线路名称
buscode   车次

地点表:
stationcode   站编号
  station   站名

中间表:
code   线路编号
stationcode   站编号
  seqnumber   某站在线路中的顺序
=======================================
线路表:
每条线路对应一路车次。按序存放各站点。每条线路有两个方向。

站点表:
每个站点,有经过该站点的所有车次。

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

转载于:https://www.cnblogs.com/LCX/archive/2006/03/21/355155.html

相关资源:邹健的SQLserver 代码
已标记关键词 清除标记
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页