是否可以选择没有递归系统的父级的所有子级作为WITH或WHILE?
结构为:
Father Child
NULL 1
1 2
1 3
2 4
3 5
4 6
6 7
我想要2的"孩子"(所有的家谱,孩子的孩子,等等等等),所以我想:
4,6,7
是。每个递归函数都有一个非递归解:
每个递归都可以转换为迭代吗?
其他可能有用的资源:
http://www.slideshare.net/rs_rs123/removal-of-recursion http://www.refactoring.com/catalog/replaceRecursionWithIteration.html如果你确切地知道你想要去的深度,那么当然,你不必使用递归。例如,要查找给定父级的第一级后代,只需执行:
select Child
from MyTable
where Father = 2
即使你想要多个层次(孙子,祖父母等),只要你知道你想要多少层次,你不需要严格地递归,你可以嵌套多个内联视图,像这样:
select t1.Child
from MyTable t1
where t1.Father = 2
or t1.Father in (
select t2.Child
from MyTable t2
where t2.Father = 2
)
(这是孩子和孙子)
然而,当你不知道你想要在树上/下走多少层时(例如所有后代),递归通常是首选的,有时是唯一的追索权(双关语)。
我自己的方法是每生成一个查询。
所以你会从孩子的id开始。对于第一代,选择其子女具有给定id的所有人。对于第二代,选择其子女在第一代具有id的所有人。等等。
与递归地查找每个人的父母相比,这显着减少了查询的数量,并且在我在sqlite上运行的测试中非常快,对于22代的家谱