Mysql SQL中的可传递有向图
我正在尝试使用SQL使图形具有可传递性 我不明白,为什么这不起作用:Mysql SQL中的可传递有向图,mysql,sql,recursion,Mysql,Sql,Recursion,我正在尝试使用SQL使图形具有可传递性 我不明白,为什么这不起作用: with recursive recursive_table(from, to) as ( SELECT * FROM Graph UNION ALL SELECT r1.to, r2.from FROM recursive_table r1, recursive_table r2 WHERE r1.from = r2.to UNION ALL SELECT * FROM rec
with recursive recursive_table(from, to) as (
SELECT * FROM Graph
UNION ALL
SELECT r1.to, r2.from FROM recursive_table r1, recursive_table r2
WHERE r1.from = r2.to
UNION ALL
SELECT * FROM recursive_table
)
SELECT * FROM recursive_table;
在每一个递归中,我取非传递图(1)中指定的元素、下一个递归的结果(3)和下一个递归的结果(2)
然而,SQL表示:
[2021-02-12 10:36:05] [HY000][3577] In recursive query block of Recursive Common Table Expression 'recursive_table', the recursive table must be referenced only once, and not in any subquery
示例输出如下所示:
输入:
+------+------+--+
| Col1 | Col2 | |
+------+------+--+
| 1 | 2 | |
| 2 | 3 | |
| 1 | 4 | |
| 4 | 5 | |
+------+------+--+
输出:
+------+------+--+
| Col1 | Col2 | |
+------+------+--+
| 1 | 2 | |
| 2 | 3 | |
| 1 | 4 | |
| 4 | 5 | |
| 1 | 3 | |
| 1 | 5 | |
+------+------+--+
所以,从数学上讲
如果您可以在大于0的有限步数内从a到b,请将(a,b)添加到图形中
例如,输入数据可以从1到2,从2到3,因此可以从1到3
另一个例子是一个有n节的圆。
这意味着,输入应该是这样的
+------+------+--+
| Col1 | Col2 | |
+------+------+--+
| 1 | 2 | |
| 2 | 3 | |
| 3 | ... | |
| ... | n | |
| n | 1 | |
+------+------+--+
正确的输出应该是[n]X[n]要确切地说出代码不工作的原因有点困难。存在多个潜在问题:
不是有效的列名from
- 递归CTE很少有两个
sunion all
- 递归CTE通常不会多次引用递归CTE
with recursive recursive_table(col1, col2) as (
SELECT col1, col2
FROM graph
UNION ALL
SELECT r1.col1, g.col2
FROM recursive_table r1 JOIN
graph g
ON r1.col2 = g.col1
)
SELECT *
FROM recursive_table;
他是一把小提琴
请注意,此代码和您的代码都假定图形没有循环。这不是问题的一部分,但如果是问题,请提出新问题。错误文本中有什么不清楚的?另外,他说:这些约束来自SQL标准,而不是特定于MySQL的ORDERBY、LIMIT(MySQL 8.0.18及更早版本)和DISTINCT排除。请以文本格式提供样本数据和所需输出。您可以使用在表格视图中格式化数据。另外,请描述转换数据的算法,以便有人可以在不学习图形算法的情况下专注于SQL任务本身。这将使你的问题更有可能得到回答。我希望我现在能说得更清楚。你的图表是否有针对性?是的。(-deleted--)您的代码有效,谢谢。不用担心,更进一步。我已经证明了@Niclas的工作原理,所以如果这解决了您的问题,并且您认为这是最佳解决方案,那么您可以。