代码之家  ›  专栏  ›  技术社区  ›  Eduardo Mauro

使用SQL查找所有可到达的节点

  •  4
  • Eduardo Mauro  · 技术社区  · 15 年前

    From To
    1    2
    2    3
    2    4
    4    5
    

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

    我使用Firebird,但我想有一个解决方案,只使用标准SQL。

    3 回复  |  直到 15 年前
        1
  •  8
  •   Bill Karwin    15 年前

    你可以使用 recursive common table expression 如果您使用大多数品牌的数据库——除了MySQL和SQLite以及其他一些晦涩难懂的(对不起,我确实认为Firebird晦涩难懂)。这种语法是ansisql标准,但是Firebird

    firebird2.1确实支持递归CTE,正如@huguesvanlandeghem所评论的那样。

    否则请看我的演示 Models for Hierarchical Data with 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
    

    SELECT * FROM MyTable WHERE From = 1 并获取该节点的所有后代。

    From

        2
  •  1
  •   Mark Byers    15 年前

    不幸的是,没有一个很好的通用解决方案可以适用于所有数据库的所有情况。

    对于MySQL解决方案,我建议您查看以下资源:

    对于PostgreSQL和sqlserver,您应该看看 recursive CTEs .

    CONNECT BY 它是SQL的专有扩展,使处理树结构变得更加容易。

        3
  •  0
  •   Novikov    15 年前

    ID   PATH
    1    1
    2    1;2
    3    1;2;3
    4    1;2;4
    
    
    SELECT * FROM tree WHERE path LIKE '%2;%'