分层SQL问题

时间:2009-08-26 17:25:18

标签: sql oracle hierarchical

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

myID | myDescription | myParentID

我开始使用一个已知对象,它可以转换为具有起始“myID”。现在我想获得所有子节点。有没有办法在一个语句中获取所有子节点?这需要包括我孩子的孩子,然后沿着树下去。我正在使用Oracle SQL。

谢谢, 杰

3 个答案:

答案 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”字段,因此该语句将仅使用单个索引扫描执行,从而使其非常高效。