有一个表distances(city1, city2, dist)
列出了几个城市以及它们之间的距离。协议(protocol)是,从这些信息中我们可以获得更多距离,就像表 distances
中的 dist A -> B 和 dist B -> C 一样,这样我们就可以获得不在表中的 A -> C 距离
。
任务是生成表distances_tr(city1, city2, dist)
,其中第一个表具有传递闭包,其中包括(A, C, dist(A,C))
.
如何使用 PROCEDURE
和简单的 SQL SELECT、INSERT、UPDATE
命令来实现这一目标?我知道可以递归地完成,但教授告诉我们两种方法都可以。
最佳答案
将 city2 上的表从一侧连接到另一侧的 city1。这里的假设是,不存在 city1 和 city2 的组合出现两次并且城市翻转的记录。如果是,请添加一个过滤器来过滤掉一侧的 city1 与另一侧的 city2 相等的位置。
关于MySQL 距离关系的传递闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33767105/