0

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

Table Paths [ PathID, Name ]
Table Routes [ 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

我想要一个查询,它可以为我提供同一路径内的所有可能组合,例如:

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    |
------------------------------------------------------
4

1 回答 1

0

这归结为两个问题。

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

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

于 2013-06-20T12:33:03.650 回答