假设我们执行递归查询以通过树的邻接表获得某个树节点的子代,但是获得仅单个子树]就足够了。
作为示例,我们将树的邻接表创建为:
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-> 5-> {6,7,8}而不是2-> 11)?我尝试将|2 2|5 2|11 5|6 5|7 5|8 11|12
现在我们如何将上面的查询限制为仅跟随single
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中实现这一目标?
假设我们通过树的邻接表执行递归查询来获取某个树节点的孩子,但是仅获取一条路径就足够了。例如,让我们创建...
您似乎想要的不是路径,而是子树,其根节点(仅)是超级树的根的子级之一...