是否可以编写一个SQLite查询,该查询以递归方式获取作为根节点的子项的所有项

Rob*_*ert 7 sql sqlite

我有2张桌子. itemsitemItems

itemItems描述了多对多之间的关系items.即一个成员items可以有很多孩子,他们可以有很多孩子,反过来可以有很多孩子等.

项目:

itemID |  more stuff ......
1         ...    
2         ...
3         ...
4         ...
Run Code Online (Sandbox Code Playgroud)

itemItems:

parentItemID |  childItemID  
1               2 
1               3
2               4
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询,以递归方式获取一个根节点下的所有子节点.

我相信这可以用一种称为递归连接的东西,但我发现这个概念非常令人困惑....(类似于这个问题,但是sqlite不是sql server而且很多都不是一对多)

通过执行以下操作,我可以获得第一级(即一个项目下的所有子项)

SELECT * 
FROM items 
INNER JOIN itemItems
ON items.itemID = itemItems.childItemID
WHERE itemItems.parentItemID = 1
Run Code Online (Sandbox Code Playgroud)

我怎么能延长这个以递归方式获得所有孩子的孩子等...?

And*_*ess 9

我只是使用with recursive语法得到了类似的查询.一般形式是:

with recursive tc( i )
  as ( select [... initial-query ...]
        union [... recursive-part (include tc) ...]
     )
 select * from tc;
Run Code Online (Sandbox Code Playgroud)

我的关键是确保tc列在递归部分中.此外,这个最终选择只是为了显示传递闭包的完整内容,真正的选择应该选择你需要的行.

我认为这个配方将适用于您的情况,如下所示.我没有对此进行测试,我只是从查询中复制/粘贴并替换为您的表名.它对我有用,但我可能错误地翻译了这个.我也不太确定效率等等,这只是我必须要做的事情.

with recursive tc( i )
  as ( select childItemID from itemItems where parentItemID = 1
        union select childItemID from itemItems, tc
               where itemItems.parentItemID = tc.i
     )
  select * from item where itemID in tc;
Run Code Online (Sandbox Code Playgroud)

注意:这适用于版本3.8.3.1但不适用于3.7.2.