H2查询中的无限循环

时间:2016-05-10 14:44:17

标签: sql infinite-loop h2 hierarchical-data hierarchical-query

我正在H2 database上通过使用JUnit运行的测试对包含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;

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

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

观察:

  • 这在Oracle
  • 中执行得很好
  • 如果表中没有指定PARENT_ID,它执行正常,但如果有,则挂起并且RAM使用量不断增加。

1 个答案:

答案 0 :(得分:2)

所以问题与您的第二个选择语句有关,该语句需要与CTE acenstors表相关

因此,基于我的查询,它正在做什么

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

2)第二个查询将被执行多次,它将寻找一个人ID =&#34; Rob&#34;,因为我们正在加入&#34; ON P1.PARENT_ID = P2。 ID&#34 ;.对于ex),这将添加[ID =&#34; ROB&#34;,Parent_ID =&#34; Susan&#34;]和ID =&#34; ROB&#34;,Parent_ID =&#34; Paul&#34 ]

在场景后面,它将再次执行第2步,这次它将查看人名Susan和Paul,并将其添加到祖先表中。这样做直到它不再返回记录。

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;