我有2张桌子. items和itemItems
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)
我怎么能延长这个以递归方式获得所有孩子的孩子等...?
我只是使用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.
| 归档时间: |
|
| 查看次数: |
4446 次 |
| 最近记录: |