SQL查询:根据主要详细信息预定义表计算交叉距离

时间:2013-06-20 12:03:47

标签: sql

我有一个包含许多表的数据库,特别是两个表一个存储路径,另一个存储路径的城市:

表路径[PathID,Name]
表路由[ID,PathID(Forein Key),City,GoTime,BackTime,GoDistance,BackDistance]

表路径:

---------------------------------------
|PathID |Name                         |
|-------+-----------------------------|
|1      |NewYork Casablanca Alpha 1   |
|7      |Paris Dubai 6007 10:00       |
---------------------------------------

表路线:

ID     PathID      City       GoTime      BackTime      GoDistance      BackDistance
1      1           NewYork    08:00       23:46         5810            NULL
2      1           Casablanca 15:43       16:03         NULL            5800
3      7           Paris      10:20       14:01         3215            NULL
4      7           Cairo      14:50       09:31         2425            3215
3      7           Dubai      18:21       06:00         NULL            2425

我想要一个Query,它在同一个Path中提供了所有可能的组合,例如:

PathID    CityFrom    CityTo     Distance

我不知道自己是否清楚,但希望你们能提前帮助我,而不是提前。

这是手动完成的好答案!!

------------------------------------------------------
|PathID |Go_Back    |CityA      |CityB      |Distance|
|-------+-----------+-----------+-----------+--------|
|1      |Go         |NewYork    |Casablanca |5810    |
|1      |Back       |Casablanca |NewYork    |5800    |
|7      |Go         |Paris      |Cairo      |3215    |
|7      |Go         |Paris      |Dubai      |5640    |
|7      |Go         |Cairo      |Dubai      |2425    |
|7      |Back       |Dubai      |Cairo      |2425    |
|7      |Back       |Dubai      |Paris      |5640    |
|7      |Back       |Cairo      |Paris      |3215    |
------------------------------------------------------

1 个答案:

答案 0 :(得分:0)

这归结为两个问题。

Q1: 如何从“路径”表中拆分列“名称”,使其处于第一范式。见wikipedia for a definition。每个属性的域仅包含原子值,每个属性的值仅包含该域中的单个值。你必须自己做。使用数据库的文本处理功能来拆分非原子列值可能很麻烦。 编写一个执行此操作的脚本(perl / python / ...),并将结果重新导入到新表中。

Q2: 如何计算“可能的路径组合”。 也许通过对表进行排序,可以使用简单的SQL查询。您没有显示足够的数据。 最终,这可以通过递归SQL来完成。 Postgres可以做到这一点。这是一个高级主题。 你必须决定你的路径是否可以包含循环。 (旅行者可能会决定多次绕道而行,虽然实际上没有任何意义。但数学上它是可能的。)