使用SQL查找所有可访问的节点

Edu*_*uro 4 sql tree firebird data-structures

假设一个表有两列:From和To.例:

From To
1    2
2    3
2    4
4    5
Run Code Online (Sandbox Code Playgroud)

我想知道找到可以使用SQL查询从节点访问的所有节点的最有效方法.示例:给定1它将返回2,3,4和5.可以使用由UNION子句联合的多个查询,但它将限制可以达到的级别数.也许不同的数据结构会使问题更容易处理,但这是可用的.

我正在使用Firebird,但我希望有一个只使用标准SQL的解决方案.

Bil*_*win 8

如果您使用大多数品牌的数据库,您可以使用递归公用表表达式 - 除了MySQL和SQLite以及一些其他模糊的数据库(抱歉,我认为Firebird模糊不清).此语法是ANSI SQL标准,但Firebird 尚不支持它.

更正:正如@Hugues Van Landeghem评论的那样,Firebird 2.1确实支持递归CTE.

否则请参阅我的演示文稿使用SQL的分层数据模型,用于几种不同的方法.

例如,您可以为树中的每个路径存储其他行,而不仅仅是直接的父/子路径.我将此设计称为闭包表.

From To   Length
1    1    0
1    2    1
1    3    2
1    4    2
1    5    3
2    2    0
2    3    1
2    4    1
3    3    0
4    4    0
4    5    1
5    5    0
Run Code Online (Sandbox Code Playgroud)

现在,您可以查询SELECT * FROM MyTable WHERE From = 1并获取该节点的所有后代.

PS:我会避免命名列From,因为这是一个SQL保留字.