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 代的家谱。
是否可以 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 代的家谱。