我有一个实体的基本树结构。树最多可以有5个节点深,但可以是N个节点宽。我已经在表格中映射了这种关系,类似于下面所示:
myID | myDescription | myParentID
我开始使用一个已知对象,它可以转换为具有起始“myID”。现在我想获得所有子节点。有没有办法在一个语句中获取所有子节点?这需要包括我孩子的孩子,然后沿着树下去。我正在使用Oracle SQL。
谢谢, 杰
答案 0 :(得分:4)
SELECT *
FROM mytable
START WITH
myid = :id
CONNECT BY
myparentid = PRIOR myid
答案 1 :(得分:0)
如果您想要检索单个查询中的所有节点,我建议使用另一种方法来建模您的层次结构。一个非常好的,通用的实现是nested set模型。本文概述了如何在MySQL中实现它,但它可以很容易地移植到Oracle。
答案 2 :(得分:0)
实现此功能的一种可能的简洁方法是添加另一个包含记录“路径”的字段。假设最高记录是ID = 1。它有一个ID = 5的孩子,它又有一个ID为20的孩子,那么最后一个记录就有了这个路径 / 1 /20分之5 因此,如果您想要您的顶级节点的所有子节点,那么
select * from MyTable where Path like '/1/%'
(抱歉,sql server语法,我不是oracle开发人员 - 但这个概念仍然适用)
获取中间节点的孩子
select * from MyTable where Path like '/1/5/%'
关于该解决方案的巧妙之处在于您可以将索引应用于“path”字段,因此该语句将仅使用单个索引扫描执行,从而使其非常高效。