小编典典

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

sql

我有2张桌子。 itemsitemItems

itemItems描述之间的多对多关系items。即,一个成员items可以有很多孩子,他们可以有很多孩子,而这些孩子又可以有很多孩子,等等。

物品:

itemID |  more stuff ......
1         ...    
2         ...
3         ...
4         ...

itemItems:

parentItemID |  childItemID  
1               2 
1               3
2               4

我想编写一个查询,该查询将以递归方式将所有子节点都放在一个根节点下。

我相信这可以通过称为递归联接的方式来实现,但是我发现这个概念非常令人困惑....(类似于问题,但使用sqlite而不是sql
server且很多对很多而不是一对多)

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

SELECT * 
FROM items 
INNER JOIN itemItems
ON items.itemID = itemItems.childItemID
WHERE itemItems.parentItemID = 1

我该如何扩展它以递归地获取所有孩子的孩子等?


阅读 191

收藏
2021-05-16

共1个答案

小编典典

我只是得到了一个使用该with recursive语法的类似查询。通用形式为:

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

在我的案例中,关键是确保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;

注意:这对我适用于3.8.3.1版本,但不适用于3.7.2。

2021-05-16