我有一个包含许多表的数据库,特别是两个表一个存储路径,另一个存储路径的城市:
表路径[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 |
------------------------------------------------------
答案 0 :(得分:0)
这归结为两个问题。
Q1: 如何从“路径”表中拆分列“名称”,使其处于第一范式。见wikipedia for a definition。每个属性的域仅包含原子值,每个属性的值仅包含该域中的单个值。你必须自己做。使用数据库的文本处理功能来拆分非原子列值可能很麻烦。 编写一个执行此操作的脚本(perl / python / ...),并将结果重新导入到新表中。
Q2: 如何计算“可能的路径组合”。 也许通过对表进行排序,可以使用简单的SQL查询。您没有显示足够的数据。 最终,这可以通过递归SQL来完成。 Postgres可以做到这一点。这是一个高级主题。 你必须决定你的路径是否可以包含循环。 (旅行者可能会决定多次绕道而行,虽然实际上没有任何意义。但数学上它是可能的。)