【发布时间】:2011-04-01 18:41:14
【问题描述】:
给定一棵存储为关系的树:
++++++++++++++++++
| Parent | Child |
++++++++++++++++++
| 1 | 2 |
++++++++++++++++++
| 1 | 3 |
++++++++++++++++++
| 3 | 4 |
++++++++++++++++++
| 3 | 5 |
++++++++++++++++++
| 2 | 6 |
++++++++++++++++++
| 7 | 8 |
++++++++++++++++++
| 7 | 9 |
++++++++++++++++++
如何获取给定节点的所有后代?例如,对于 1,我想要 (1, 2, 3, 4, 5, 6),对于 3,我想要 (3, 4, 5),对于 7,我想要 想要 (7, 8, 9)。
我是通过脚本(Python,但这没关系)执行此操作的,所以我 可以做类似的事情:
children(p):
nodes = SELECT child FROM relation WHERE parent=p
for each node in nodes
nodes += children(node)
return nodes
nodes = children(root)
但是,如果有一些时髦的 SQL 可以让我在一个查询中做到这一点,那 会很棒。
【问题讨论】:
-
这棵树可以有多深?递归 CTE(SQL 2005 及更高版本)是一个不错的选择,但它们的递归深度相当有限。
-
您可能也应该指定什么 RDBMS。
-
@Philip Kelley:“有限”是什么意思? doc 声明默认值为 100,但您可以明确指定,例如 0,这意味着无限的递归深度。
-
@phillip:我想一般来说这棵树可以是任何深度。就我而言,我怀疑它会超过十几个层次。
-
@JNK:我使用的是 PostgreSQL,但如果有通用的,我更喜欢它。