在SQL中选择父的所有家谱,不使用WITH或WHILE



是否可以选择没有递归系统的父级的所有子级作为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代的家谱

相关内容

  • 没有找到相关文章

最新更新