我有2张桌子。 items和itemItems
items
itemItems
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
我该如何扩展它以递归地获取所有孩子的孩子等?
我只是得到了一个使用该with recursive语法的类似查询。通用形式为:
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。