【问题标题】:Hierarchical SQL question分层 SQL 问题
【发布时间】:2010-11-23 02:33:50
【问题描述】:

我有一个基本的实体树结构。树最多可以有 5 个节点深,但可以有 N 个节点宽。我在表格中映射了这种关系,如下所示:

myID | myDescription | myParentID

我从一个已知对象开始,它可以转化为具有一个起始“myID”。现在我想获取所有子节点。有没有办法在一个语句中获取所有子节点?这需要包括我的孩子们的孩子们,并继续往下走。我正在使用 Oracle SQL。

谢谢, 周杰伦

【问题讨论】:

    标签: sql oracle hierarchical


    【解决方案1】:

    实现这一点的一种可能的巧妙方法是向记录添加另一个包含“路径”的字段。假设最高记录是 ID=1。它有一个 ID=5 的孩子,它又有一个 ID=20 的孩子,那么最后一条记录将具有路径 /1/5/20 因此,如果您想要顶部节点的所有子节点,您可以这样做

    select * from MyTable where Path like '/1/%'
    

    (抱歉,sql server 语法,我不是 oracle 开发人员 - 但这个概念仍然适用)

    获取中间节点的子节点

    select * from MyTable where Path like '/1/5/%'
    

    该解决方案的巧妙之处在于您可以将索引应用于“路径”字段,因此该语句将仅使用单个索引扫描执行,从而非常高效。

    【讨论】:

      【解决方案2】:

      如果您想在单个查询中检索所有节点,我建议您使用另一种方式来为您的层次结构建模。 nested set 模型是一种非常好的和常见的实现。这篇文章概述了这是如何在 MySQL 中实现的,但它可以很容易地移植到 Oracle。

      【讨论】:

      • 这是一个很酷的模型,但不建议同时更新大量数据。添加叶子可以更新表中的所有记录。 如果数据变化很少,这是一个很好的建议。
      【解决方案3】:
      SELECT  *
      FROM    mytable
      START WITH
              myid = :id
      CONNECT BY
              myparentid = PRIOR myid
      

      【讨论】:

      猜你喜欢
      • 2011-07-06
      • 2011-04-03
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2017-08-29
      • 1970-01-01
      相关资源
      最近更新 更多