我有一个基本的实体树结构。树最多可以有 5 个节点深,但可以有 N 个节点宽。我在表格中映射了这种关系,如下所示:
myID | myDescription | myParentID
我从一个已知对象开始,它可以转化为具有起始“myID”。现在我想获取所有子节点。有没有办法在一个语句中获取所有子节点?这需要包括我的孩子们的孩子们,并继续往下走。我正在使用 Oracle SQL。
谢谢,杰
我有一个基本的实体树结构。树最多可以有 5 个节点深,但可以有 N 个节点宽。我在表格中映射了这种关系,如下所示:
myID | myDescription | myParentID
我从一个已知对象开始,它可以转化为具有起始“myID”。现在我想获取所有子节点。有没有办法在一个语句中获取所有子节点?这需要包括我的孩子们的孩子们,并继续往下走。我正在使用 Oracle SQL。
谢谢,杰
SELECT *
FROM mytable
START WITH
myid = :id
CONNECT BY
myparentid = PRIOR myid
实现这一点的一种可能的巧妙方法是添加另一个包含“路径”到记录的字段。假设最高记录是 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/%'
该解决方案的巧妙之处在于您可以将索引应用于“路径”字段,因此该语句将仅使用单个索引扫描执行,使其非常高效。
如果您想在单个查询中检索所有节点,我建议您使用另一种方式来为您的层次结构建模。一个非常好的和常见的实现是嵌套集模型。这篇文章概述了这是如何在 MySQL 中实现的,但它可以很容易地移植到 Oracle。