我正在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)。 为什么会发生这种情况?我该如何解决?
观察:
答案 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;