代码之家  ›  专栏  ›  技术社区  ›  Jay

分层SQL问题

  •  2
  • Jay  · 技术社区  · 15 年前

    我有一个基本的实体树结构。树最多可以有5个节点深,但可以有n个节点宽。我已将此关系映射到表中,如下所示:

    myID | myDescription | myParentID
    

    我从一个已知的对象开始,这可以转化为有一个开始的“myid”。现在我要获取所有子节点。是否有一种方法可以在一个语句中获取所有子节点?这需要包括我孩子们的孩子们,然后沿着树往下走。我正在使用Oracle SQL。

    谢谢, 杰伊

    3 回复  |  直到 12 年前
        1
  •  4
  •   Quassnoi    15 年前
    SELECT  *
    FROM    mytable
    START WITH
            myid = :id
    CONNECT BY
            myparentid = PRIOR myid
    
        2
  •  0
  •   PatrikAkerstrand    15 年前

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

        3
  •  0
  •   Pete    15 年前

    实现这一点的一个可能的好方法是添加另一个包含记录“路径”的字段。假设最高记录是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/%'
    

    该解决方案的好处在于,您可以将索引应用到“path”字段,因此语句将只使用一个索引扫描来执行,从而使其非常高效。