2

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

myID | myDescription | myParentID

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

谢谢,杰

4

3 回答 3

4
SELECT  *
FROM    mytable
START WITH
        myid = :id
CONNECT BY
        myparentid = PRIOR myid
于 2009-08-26T17:27:56.837 回答
0

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

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

于 2009-08-26T17:42:35.077 回答
0

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

于 2009-08-26T17:29:53.447 回答