使用CONNECT BY通过Oracle中的SQL查询获取层次结构中的所有父项和一个子项

s k*_*han 4 sql oracle hierarchy

我正在浏览一些关于CONNECT BY用法的帖子.我需要找到的是,如果我想要获得所有父母(即,最多根)和一个节点的一个孩子,例如4,该怎么办.

看来我必须使用以下两种的联合: -

 SELECT  * 
 FROM    hierarchy 
 START WITH id = 4
 CONNECT BY id = PRIOR parent
union
     SELECT  *
     FROM    hierarchy
     WHERE LEVEL =<2
     START WITH
     id = 4
     CONNECT BY
     parent = PRIOR id
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,一些更优化的解决方法?

Pet*_*ang 8

您应该能够使用子选择(和DISTINCT)来查找以下所有子项4:

Select Distinct *
From hierarchy
Start With id In ( Select id
                   From hierarchy
                   Where parent = 4 )
Connect By id = Prior parent
Run Code Online (Sandbox Code Playgroud)

使用UNION你至少可以删除CONNECT BY第二个查询:

  Select *
  From hierarchy
  Start With id = 4
  Connect By id = Prior parent
Union
  Select *
  From hierarchy
  Where parent = 4
Run Code Online (Sandbox Code Playgroud)

永远不要使用SELECT *,总是命名您实际需要的列.这使您的查询更易于阅读,维护和优化.