是否可以选择没有递归系统的父母的所有孩子作为 WITH 或 WHILE?
结构是:
Father Child
NULL 1
1 2
1 3
2 4
3 5
4 6
6 7
我想要2的“孩子”(所有家谱,孩子的孩子等),所以我想要:
4、6、7
如果您确切地知道要达到的深度,那么可以肯定,您不必使用递归。例如,要查找给定父级的第一级后代,只需执行以下操作:
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
)
(这得到了孩子和孙子)
但是,当您不知道要向上/向下移动多少级树时(例如,所有后代),递归通常是首选,有时是唯一的资源(双关语)。
是的。每个递归函数都有一个非递归解:
其他一些可能有用的资源:
http://www.slideshare.net/rs_rs123/removal-of-recursion
http://www.refactoring.com/catalog/replaceRecursionWithIteration.html
我自己的方法是每一代进行一次查询。
所以你会从孩子的身份证开始。对于第一代,选择其孩子具有给定 id 的所有人员。对于第二代,选择所有其孩子在第一代中具有 id 的人。等等。
与递归查找每个人的父母相比,这显着减少了查询的数量,并且在我在 sqlite 上运行的测试中非常快,对于 22 代的家谱。