if OBJECT_ID('T_Line','u')is not null
drop table T_Line
go
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
 
if object_id('usp_bus_way_line','p')is not null
drop proc usp_bus_way_line
go
--======================================================
--Author:    Jimmy
--Create Date: 2013-10-11
--Description: 乘车线路查询存储过程
--======================================================
create proc usp_bus_way_line
@Station_Start nvarchar(10),   --起始站
@Station_Stop  nvarchar(10)    --终点站
as
begin
-- 关闭返回行计数
set nocount on
declare @l int
set @l=0
-- 输入起始站为条件,把查询出来的数据插入到临时表中
select ID,Station,
--Line主要取值是(id:站名
   Line=CAST('('+RTRIM(ID)+': '+RTRIM(Station) as nvarchar(4000)),
   Orders=Orders,
   [Level]=@l
into #table from T_Line
where Station=@Station_Start
-- 循环直到@@ROWCOUNT>0并且终点站在临时表中不存在
while @@ROWCOUNT>0 and not exists(select * from #table where Station=@Station_Stop)
begin
set @l=@l+1
--向临时表中插入数据
insert #table(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 #table 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 #table
where [Level]=@l AND Station=@Station_Stop
--如果未有可以到达的线路,则显示处理结果表备查
if @@ROWCOUNT =0
select * from #table
end
go
 
--调用
exec usp_bus_way_line N'站A',N'站F'
go

解决方案 »

  1.   

    个人觉得这个表设计不够合理,如果某个站名一变,到时候不是会很麻烦,因为某一个站会被多个线路共有。CREATE TABLE T_Line(
    ID      nvarchar(10),  --公交线路号
    Station_ID int,  --站点编号
    Orders  int)   CREATE TABLE T_Station(
    Station_ID int,  --站点编号
    Station_Name nvarchar(256) --公交站名称)     
      

  2.   

    我学习自连接时看到的小例子表名:车过站表(passStation)
       车次 顺次 站点  
       110   1    上海
       110   2    南京
       112   1    北京
       110   3    浙江
       110   4    江苏
    。。
    假如要查询经过南京和江苏的车次
    可以通过自连接来解决
     
    select r1.checi from test r1,test r2
    where r1.checi=r2.checi and
    (
    r1.chezhan='江苏' and r2.chezhan='南京'
    )