在简单的列车时刻表数据库中交叉引用列车停靠

时间:2017-01-04 17:29:54

标签: sql database sqlite

我需要为火车时刻表创建一个简单的数据库。

我将有一张包含列车所有路线的路线表。路线将类似于

 id | departure_station | arrival_station | time

但是,如果departure_station为B且到达站为G,我会将CF之间的所有电台放在他们之间,无法总结时间或更别说为用户提供整条路线了。

我的想法是为每个电台提供一个唯一的ID,然后检索ID为&departure_station且ID为B的所有G个结果,按ID排序,结果将是-C-D-E-F-,但似乎这不是最简单的方法。

由于SQL数据库没有按顺序排列结果,我如何将B引用到D,然后D引用E,{{1}到E直到F

编辑:

样品

G

客户希望离开traind_id | departs | arrives | route_id 1337 Iasi Pascani 56 route_id | dep_station | arr_station | time 56 Val. Lupului Letcani 00:05 56 Letcani Tg. Frumos 00:10 56 Tg. Frumos Podu Iloaiei 00:20 56 Podu Iloaiei Motca 00:10 56 Motca Pascani 00:30 并到达Letcani。为此,我想告诉他,他可以在Motca路线上乘坐1337号列车 他的电台将Iasi-Pascani,总Letcani-Tg. Frumos-Podu Iloaiei-Motca

但是如何按顺序选择电台?如果两个电台之间没有任何连接,除了它们之间的中间电台,我怎么知道我可以从route time = 00:10 + 00:20 + 00:10 = 00:40 minutes到达Motca

1 个答案:

答案 0 :(得分:0)

首先,找出是否有任何匹配的路线,即任何有出发站和到站的路线:

SELECT route_id
FROM RouteStations AS R1
JOIN RouteStations AS R2 USING (route_id)
WHERE R1.dep_station = 'Letcani'
  AND R2.arr_station = 'Motca';

然后,对于每个这样的路线,使用递归common table expression来获取电台:

WITH RECURSIVE steps(nr, dep, arr, time) AS (
  SELECT 1,
         dep_station,
         arr_station,
         time
  FROM RouteStations
  WHERE route_id = 56
    AND dep_station = 'Letcani'

  UNION ALL

  -- fetch the step that departs from the previous arrival station
  SELECT steps.nr + 1,
         RouteStations.dep_station,
         RouteStations.arr_station,
         RouteStations.time
  FROM RouteStations
  JOIN steps ON steps.arr_station = RouteStations.dep_station
  WHERE route_id = 56
    AND RouteStations.dep_station <> 'Motca'
)
SELECT *
FROM steps
ORDER BY nr;