1

是否可以选择没有递归系统的父母的所有孩子作为 WITH 或 WHILE?

结构是:

Father  Child

NULL    1
1       2
1       3
2       4
3       5
4       6
6       7

我想要2的“孩子”(所有家谱,孩子的孩子等),所以我想要:

4、6、7

4

3 回答 3

2

如果您确切地知道要达到的深度,那么可以肯定,您不必使用递归。例如,要查找给定父级的第一级后代,只需执行以下操作:

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
)

(这得到了孩子和孙子)

但是,当您不知道要向上/向下移动多少级树时(例如,所有后代),递归通常是首选,有时是唯一的资源(双关语)。

于 2015-08-07T15:18:30.277 回答
2

是的。每个递归函数都有一个非递归解:

每个递归都可以转换成迭代吗?

其他一些可能有用的资源:

http://www.slideshare.net/rs_rs123/removal-of-recursion

http://www.refactoring.com/catalog/replaceRecursionWithIteration.html

于 2015-08-07T15:35:35.060 回答
1

我自己的方法是每一代进行一次查询。

所以你会从孩子的身份证开始。对于第一代,选择其孩子具有给定 id 的所有人员。对于第二代,选择所有其孩子在第一代中具有 id 的人。等等。

与递归查找每个人的父母相比,这显着减少了查询的数量,并且在我在 sqlite 上运行的测试中非常快,对于 22 代的家谱。

于 2015-09-15T07:35:54.867 回答