zoukankan      html  css  js  c++  java
  • 最短乘车路线查询示例.sql

    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)
    --*/

  • 相关阅读:
    通过存储过程的游标修改某个字段的全部数据
    spring cloud配置注册中心显示服务的ip地址和端口
    git几个必知托管平台
    hdu5790
    hdu5794
    hdu5739
    hdu5829
    线性规划初探
    bzoj4199
    bzoj4197
  • 原文地址:https://www.cnblogs.com/dushu/p/2531892.html
Copyright © 2011-2022 走看看