限制递归查询的初始(锚定)值(带语句)

问题描述 投票:1回答:1

假设我们执行递归查询以通过树的邻接表获得某个树节点的子代,但是获得仅单个子树]就足够了。

作为示例,我们将树的邻接表创建为:

CREATE TABLE Tree
       (parent INTEGER,
        child  INTEGER);

INSERT INTO Tree
       VALUES -- (parent -> child)
              (1, 2), (1, 3), (1, 4),
              (2, 5), (2, 11), (3, 9),
              (5, 6), (5, 7),  (5, 8),
              (9, 10), (11, 12);

然后进行递归查询以获取节点2的子代:

WITH RECURSIVE children_i (parent, child)
AS (
   -- anchor/initial values
   VALUES (NULL, 2)
   -- SELECT parent, child FROM Tree WHERE parent = 2 LIMIT 1
   UNION ALL
   -- recursion
   SELECT children_i.child, Tree.child FROM Tree, children_i
   WHERE Tree.parent = children_i.child
   )
SELECT * FROM children_i;

将产生

|2
2|5
2|11
5|6
5|7
5|8
11|12

现在我们如何将上面的查询限制为仅跟随single

子树(仅说2-> 5-> {6,7,8}而不是2-> 11)?我尝试将LIMIT添加到递归的锚定部分,
WITH RECURSIVE children_i (parent, child)
AS (
   -- anchor/initial values
   SELECT parent, child FROM Tree WHERE parent = 2 LIMIT 1
   UNION ALL
   -- recursion
   SELECT children_i.child, Tree.child FROM Tree, children_i
   WHERE Tree.parent = children_i.child
   )
SELECT * FROM children_i;

但它产生语法错误,LIMIT clause should come after UNION ALL not before(SQLite 3.16.2)。

如何在SQLite中实现这一目标?

假设我们通过树的邻接表执行递归查询来获取某个树节点的孩子,但是仅获取一条路径就足够了。例如,让我们创建...

sqlite limit recursive-query with-statement
1个回答
0
投票

您似乎想要的不是路径,而是子树,其根节点(仅)是超级树的根的子级之一...

© www.soinside.com 2019 - 2024. All rights reserved.