帖子里说不清楚,要求用存储过程实现换乘查询。加我QQ:562342,我会发给你数据库,一共两张表,里面有充足的测试数据。50元求高手帮解决

解决方案 »

  1.   

    50 RMB....
    不如这里散500分
      

  2.   

    --最短乘车路线查询示例(邹老大的。)
    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)
    --*/
      

  3.   

    /*
    标题:一个有关车站换乘的例
    作者:爱新觉罗.毓华 
    时间:2008-05-22
    地点:广东深圳
    *//*
    数据库中有一张表记录了车号和它经过的站点,  
    比如:  
    车号    所经过的站点  
    1       a,b,c,d,e,f  
    2       k,n,m,d,l,q,w  
    3       aa,ee,ww,oo,ef,cc,qw  
    4       aa,o,p,d,l,q,w,s  
    如果我现在要查从a到w可以乘做的车次,可以看出要转车,也就是坐1路到d站点,
    然后在坐2路或是4路  
    现在我要写一个存储过程输入两个站点的名称比如a,w要得到  车次1   车次2   转车点  
    1        2,4    d  
    也就是先坐1路,再在d站点转2路或4路  请问这个存储过程怎么写
    */create table tb(车号 int,所经过的站点 varchar(50))
    insert into tb values(1 ,      'a,b,c,d,e,f')  
    insert into tb values(2 ,      'k,n,m,d,l,q,w')  
    insert into tb values(3 ,      'aa,ee,ww,oo,ef,cc,qw')  
    insert into tb values(4 ,      'aa,o,p,d,l,q,w,s')
    go
    --生成一临时表
    SELECT TOP 8000 id = IDENTITY(int, 1, 1) INTO # FROM syscolumns a, syscolumns b declare @s1 as varchar(10)
    declare @s2 as varchar(10)
    set @s1 = 'a'
    set @s2 = 'w'select * from 
    (
      SELECT A.车号 , 站点 = SUBSTRING(A.[所经过的站点], B.id, CHARINDEX(',', A.[所经过的站点] + ',', B.id) - B.id)
      FROM tb A, # B
      WHERE SUBSTRING(',' + A.[所经过的站点], B.id, 1) = ',' 
    ) t 
    where (站点 = @s2 or 站点 in
    (
      SELECT 站点 = SUBSTRING(A.[所经过的站点], B.id, CHARINDEX(',', A.[所经过的站点] + ',', B.id) - B.id)
      FROM tb A, # B
      WHERE SUBSTRING(',' + A.[所经过的站点], B.id, 1) = ',' 
      and 车号 in (select 车号 from tb where charindex(',' + @s1 + ',' , ',' + 所经过的站点 + ',') > 0)
    ) ) and 车号 not in (select 车号 from tb where charindex(',' + @s1 + ',' , ',' + 所经过的站点 + ',') > 0)
    /*
    车号          站点                                                 
    ----------- -------------------------------------------------- 
    2           d
    2           w
    4           d
    4           w(所影响的行数为 4 行)
    */-------------------------------------------------------------------------------------------------------------
    select 车号 from 
    (
      SELECT A.车号 , 站点 = SUBSTRING(A.[所经过的站点], B.id, CHARINDEX(',', A.[所经过的站点] + ',', B.id) - B.id)
      FROM tb A, # B
      WHERE SUBSTRING(',' + A.[所经过的站点], B.id, 1) = ',' 
    ) t 
    where (站点 = @s2 or 站点 in
    (
      SELECT 站点 = SUBSTRING(A.[所经过的站点], B.id, CHARINDEX(',', A.[所经过的站点] + ',', B.id) - B.id)
      FROM tb A, # B
      WHERE SUBSTRING(',' + A.[所经过的站点], B.id, 1) = ',' 
      and 车号 in (select 车号 from tb where charindex(',' + @s1 + ',' , ',' + 所经过的站点 + ',') > 0)
    ) ) and 车号 not in (select 车号 from tb where charindex(',' + @s1 + ',' , ',' + 所经过的站点 + ',') > 0)
    group by 车号 
    having count(*) = 2
    /*
    车号          
    ----------- 
    2
    4(所影响的行数为 2 行)
    */drop table tb , #