H2查询中的无限循环

Infinite loop in H2 query

我正在 H2 database through a test ran using JUnit 上执行以下查询,在 table 上有 3 个条目:

WITH ancestors(ID, PARENT_ID) AS 
(
  SELECT ID, PARENT_ID FROM PEOPLE WHERE ID = <person_id>
    UNION ALL
  SELECT P1.ID, P1.PARENT_ID FROM PEOPLE P1, PEOPLE P2 WHERE P1.ID = P2.PARENT_ID
)
SELECT ID FROM ancestors;

查询在包含人员的自引用 table 上执行。它会找到一个人所有祖先的 ID。

由于某种原因,这运行了我猜想的无限循环,因为测试挂起,我可以看到 RAM 使用率快速上升 (>2GB)。 为什么会发生这种情况,我该如何解决?

观察:

所以问题与您的第二个 select 声明有关,该声明需要与 CTE acenstors table

所以根据我的查询,它正在做的是

1) 因此第一个查询将添加起始节点并执行一次。例如ID="John",Parent_ID="Rob"

2) 将执行多次的第二个查询将查找 ID="Rob" 的人,因为我们要加入 "ON P1.PARENT_ID = P2.ID"。例如)这将添加 [ID="ROB"、Parent_ID="Susan"] 和 ID="ROB"、Parent_ID="Paul"]

3) 在后台,它会再次执行步骤 2,这次它会查找名为 Susan 和 Paul 的人并将其添加到祖先 table。这样做直到 returns 没有更多记录。

WITH ancestors(ID, PARENT_ID) AS 
(
    --child
    SELECT 
        ID, 
        PARENT_ID 
    FROM PEOPLE 
    WHERE ID = <person_id>

    UNION ALL

    --get my lineage
    SELECT 
        P2.ID, 
        P2.PARENT_ID 
    FROM ancestors P1 
    INNER JOIN PEOPLE P2 
        ON P1.PARENT_ID = P2.ID
)
SELECT ID FROM ancestors;