Mysql 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

我正在尝试使用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 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很少有两个
    union all
    s
  • 递归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的工作原理,所以如果这解决了您的问题,并且您认为这是最佳解决方案,那么您可以。