Select SQL 中没有 WITH 或 WHILE 的父亲的所有家谱

Select all genealogy of a father in SQL without WITH or WHILE

是否可以 select 一个 parent 的所有孩子,而不用像 WITH 或 WHILE 这样的递归系统?

结构是:

Father  Child

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

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

4、6、7

如果您确切地知道要达到什么深度,那么当然,您不必使用递归。例如,要查找给定 parent 的 first-level 后代,只需执行:

select Child
from MyTable
where Father = 2

即使你想要多级(grandchildren、grandparents等),只要你知道你想要多少级,你并不严格需要递归,你可以像这样嵌套多个内联视图:

select t1.Child
from MyTable t1
where t1.Father = 2
or t1.Father in (
    select t2.Child
    from MyTable t2
    where t2.Father = 2
)

(这得到 children 和 grandchildren)

但是,任何时候您不知道要走多少层 up/down 一棵树(例如 所有后代 ),递归通常是首选,并且有时是唯一的办法(双关语)。

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

Can every recursion be converted into iteration?

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

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

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

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

所以您将从 child 的 ID 开始。对于第一代,select 所有 child 具有给定 id 的人。对于第二代,select 所有在第一代中 child 有 id 的人。等等。

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