公交车来回路线不一致,该如何设计数据库

公交车来回路线不一致,该如何设计数据库,第1张

三张表,1..保存所有站点信息的表,2.线路表,即哪条线,起点和终点分别在哪里 3.线路经过站资料表,保存哪条线路所经过的站点信息 表1:站点基表 uBusRoot,基本结构如下: fId 序号 fName 站点名称 表2:线路表 uBusLine,基本结构如下: fId 序号 fName 线路名称 fBegin 起始站编号 fEnd 终点站编号 其中fBegin,fEnd 均为 uBusRoot 表里fId值,即表示为哪个站点; 表3:线路经过表 uBusLinePass,基本结构如下: fId 序号 lId 线路编号 rId 站点编号 fType 站点类型(0-起始站,1-终点站,2-经过站) (fType 可以不要,这样建立视图时,把起始站和终点也加上即可。) 再需要建立两张视图来辅助我们查询: 线路视图:vBusLine SELECT uBusLine.fId AS 序号, uBusLine.fName AS 线路名称, (SELECT uBusRoot.fName FROM uBusRoot WHERE uBusRoot.fId= uBusLine.fBegin) AS 起始站, (SELECT uBusRoot.fName FROM uBusRoot WHERE uBusRoot.fId= uBusLine.fEnd) AS 终点站 FROM uBusLine线路经过视图:vBusLinePass SELECT uBusLinePass.fId AS 序号, uBusLine.fName AS 线路名称, uBusRoot.fName AS 经过站, uBusLinePass.fType AS 类型 FROM (uBusLinePass INNER JOIN uBusLine ON uBusLinePass.lId = uBusLine.fId) INNER JOIN uBusRoot ON uBusLinePass.rId = uBusRoot.fId基本表结构大概可以像上面这样子,其中表uBusLine和uBusLinePass,是一对多的关系,即一条线路有多个经过站,这样的话,想查经过站是不难的,当然你也可以把线路经过站的表设计的复杂一些,如:加上时间字段,表明到这个站需要多长时间等等。 我们根据以上结构来模拟一些数据: uBusRoot 1 城东站 2 城南站 3 城西站 4 城北站 5 解放路站 6 人民路站 7 汽车总站 8 汽车二站 9 城市广场 uBusLine 1 一号线路 1 4 2 二号线路 2 7 3 三号线路 3 8 uBusLinePass 1 1 1 0 2 1 4 1 3 1 5 2 4 1 6 2 5 2 2 0 6 2 7 1 7 2 5 2 8 2 9 2 9 3 3 0 10 3 8 1 11 3 4 2 12 3 6 2 那么现在我们要查询的话,就很方便了,如,我们要查一下“一号线路”线路的信息,我们可以用语句: SELECT * FROM vBusLinePass WHERE 线路名称='一号线路' 那么结果就是: 序号 线路名称 经过站 类型 1 一号线路 城东站 0 2 一号线路 城北站 1 4 一号线路 人民路站 2 3 一号线路 解放路站 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)

--*/


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6834053.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-29
下一篇 2023-03-29

发表评论

登录后才能评论

评论列表(0条)

保存