因为是做公交车,我的想法是每一条线路做一个表,但是现在城市的公交系统太发达了,光一个城市的公交车就有几百条线路,做出来太麻烦了,有没有简单一点的,哪位大神知道的话,求一个答案,谢谢!
------解决方案--------------------
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
------解决方案--------------------
个人觉得这个表设计不够合理,如果某个站名一变,到时候不是会很麻烦,因为某一个站会被多个线路共有。
CREATE TABLE T_Line(
ID nvarchar(10), --公交线路号
Station_ID int, --站点编号
Orders int)
CREATE TABLE T_Station(
Station_ID int, --站点编号
Station_Name nvarchar(256) --公交站名称)
------解决方案--------------------
我学习自连接时看到的小例子
表名:车过站表(passStation)
车次 顺次 站点
110 1 上海
110 2 南京
112 1 北京