公交查询系统SQL查询储存过程
线路查询:
CREATE PROCEDURE Link_Select
(
@Line varchar(10)
)
AS
SELECT *
FROM [线路属性]
WHERE bus LIKE Rtrim(@Line)
GO
站点查询:
CREATE PROCEDURE Site_Select
(
@Site varchar(20)
)
AS
SELECT *
FROM [线路表]
WHERE sname LIKE Rtrim(@Site)
GO
换乘查询:
算法描诉
假设需要从站点A到达站点C
1.搜索所有可以直达A的站点,站点名的集合为B1,通过A及{x| x in B1}中任一站点的车次的集合为L1
2.搜索所有可以直达C的站点,站点名的集合为B2,通过C及{x| x in B2}中任一站点的车次的集合为L2
3.求出B1与B2的交集为B,B中的站点即是站点A到达站点C的中转站
4.(foreach Site in B) //通过遍历B中的站点,来得出“总经过站点数”最少的最优路线
{
从L1中找出A到达Site的最短线路,此线路为(起点站)
从L2中找出C到达Site的最短线路,此线路为(终点站)
A到达Site经过站点数 + C到达Site经过的站点数 = 总经过站点数
}
CREATE PROCEDURE StoS_Select
(
@Begin_Site nvarchar (20),
@End_Site nvarchar (20)
)
AS
SELECT DISTINCT TOP 10 m.起点线路, m.起点站, m.中转站, n.终点站, n.终点线路, ABS(M.经过站点数 + N.经过站点数) AS 总经过站点数
FROM (SELECT A.bus AS 起点线路 , A.sname AS 起点站 , B.sname AS 中转站 ,ABS(A.snum - B.snum ) AS 经过站点数
FROM 线路表 AS A, 线路表 AS B
WHERE A.sname LIKE Rtrim(@Begin_Site) AND (A.sname <> B.sname AND A.bus = B.bus))
AS m(起点线路,起点站,中转站,经过站点数)
,
(SELECT C.sname AS 中转站 ,D.sname AS 终点站 ,D.bus AS 终点线路 ,ABS(C.snum - D.snum ) AS 经过站点数
FROM 线路表 AS C, 线路表 AS D
WHERE D.sname LIKE Rtrim(@End_Site) AND (C.sname <> D.sname AND C.bus = D.bus))
AS n(中转站,终点站,终点线路,经过站点数)
WHERE m.中转站 = n.中转站 AND (m.起点线路 <> n.终点线路) ORDER BY 总经过站点数
GO
posted on 2013-06-20 09:54 jinglikeblue 阅读(203) 评论(0) 收藏 举报
浙公网安备 33010602011771号