我正在尝试为公交路线建立一个关系数据库,这是我的数据库:
BusRoutes: RouteId, RouteNumber
BusStops: StopId, StopName
BusRouteStops: Id, RouteId, StopId, StopOrder, ArrivalTime, DepartureTime, Distance
BusRoutes:
1 RouteO
2 RouteP
3 RouteQ
4 RouteR
5 RouteS
BusStops:
1 Stop A
2 Stop B
3 Stop C
4 Stop D
5 Stop E
6 Stop F
7 Stop G
8 Stop H
9 Stop I
10 Stop J
11 Stop K
BusRouteStops:
1 1 1 10 05:00:00 05:01:00 0.00
2 1 2 20 05:15:00 05:16:00 1.00
3 1 3 30 05:30:00 05:31:00 1.00
4 1 4 40 05:45:00 05:45:00 1.00
5 1 5 50 06:00:00 06:00:00 1.00
7 2 3 10 06:00:00 06:00:00 0.00
11 2 6 20 06:10:00 06:11:00 0.70
12 2 7 30 06:20:00 06:21:00 0.70
13 2 8 40 06:30:00 06:31:00 0.70
15 3 5 10 05:15:00 05:16:00 0.00
16 3 4 20 05:30:00 05:31:00 1.00
17 3 3 30 05:45:00 05:46:00 1.00
18 3 2 40 06:00:00 06:01:00 1.00
19 3 1 50 06:15:00 06:16:00 1.00
20 4 8 10 07:00:00 07:01:00 0.00
21 4 7 20 07:10:00 07:11:00 0.70
22 4 6 30 07:20:00 07:21:00 0.70
23 4 3 40 07:30:00 07:31:00 0.70
查找站点“ A到D”,“ D到A”,“ C到H”和“ H到C”之间的直接路线不是问题。 例如,要找到“ A到D”或“ D到A”,我可以执行以下SQL
SELECT * FROM BusRouteStops WHERE StopId=1
UNION
SELECT * FROM BusRouteStops WHERE StopId=4
ORDER BY BusRouteStops.RouteId, StopOrder
我将得到以下结果。在此SQL中,A到D也将D到A路由返回,但是使用一些编码逻辑,我将能够根据StopOrder字段找到正确的代码(在这里我可以执行检查FromStation stoporder应该低于ToStation StopOrder)>
我是否可以通过查询正确的SQL消除该检查?
1 1 1 10 05:00:00.0000000 05:01:00.0000000 0.00
16 1 4 20 05:30:00.0000000 05:31:00.0000000 1.00
4 1 4 40 05:45:00.0000000 05:45:00.0000000 1.00
19 1 1 50 06:15:00.0000000 06:16:00.0000000 1.00
我的挑战是在找不到直接路线时找到路线。
例如,如果我要查找路线“ A到G”,如何制作SQL? 我需要得到这样的结果: 步骤1:从“ A到C”乘坐RouteQ 步骤2:将RouteP从“ C转到G”
如果我这样执行SQL:
SELECT * FROM BusRouteStops WHERE StopId=1
UNION
SELECT * FROM BusRouteStops WHERE StopId=7
ORDER BY BusRouteStops.RouteId, StopOrder
它只会这样返回:
1 1 1 10 05:00:00.0000000 05:01:00.0000000 0.00
19 1 1 50 06:15:00.0000000 06:16:00.0000000 1.00
21 2 7 20 07:10:00.0000000 07:11:00.0000000 0.70
12 2 7 30 06:20:00.0000000 06:21:00.0000000 0.70
它只会显示两条路径,其中StopId 1或7是其中的一部分。 我没有任何迹象表明这两个路线都有一个共同的站点,即C(StopId = 3)
如何执行一条给我该指示的SQL语句?
我当然简化了,在最终版本中,一条路线可以有50多个站点。有些路线只有一个共同点,而其他路线则有一个以上与其他路线共同点。
希望您能帮助我找到解决方案。