Oracle 树操作(select…start with…connect by…prior),找后代,找祖辈,找父辈,找父节点

--查找一个节点所有直属父节点(直到祖先),eg:找到一个节点(儿子)-父亲-祖父-...-祖先
select * from T_DEPARTMENT m start with m.id='71ee6f3ad2844c72a5dc6ffe3dd936d9' connect by prior m.parentid=m.id;

查询结果:

展示方式

Oracle 树操作(select…start with…connect by…prior),找后代,找祖辈,找父辈,找父节点_第1张图片

--查找一个节点(儿子)直属父节点(父亲),eg:找到一个节点(儿子)-父亲

select  p.* from T_DEPARTMENT c, T_DEPARTMENT p where c.parentid=p.id and c.id='71ee6f3ad2844c72a5dc6ffe3dd936d9';

查询结果:

展示方式

--查找一个节点的所有直属子节点(所有后代)

select * from T_DEPARTMENT m start with m.id='b827f741ed444b1a971d1c67fa1b5ee8' connect by m.parentid=prior m.id;

查询结果:

展示方式

Oracle 树操作(select…start with…connect by…prior),找后代,找祖辈,找父辈,找父节点_第2张图片

--查询一个节点的兄弟节点(亲兄弟,即同一个父亲)
select * from T_DEPARTMENT m where exists (select * from T_DEPARTMENT m2 where m.parentid=m2.parentid and m2.id='71ee6f3ad2844c72a5dc6ffe3dd936d9');
--查询与一个节点同级的节点(族兄弟)。 如果在表中设置了级别的字段,那么在做这类查询时会很轻松,
--同一级别的就是与那个节点同级的,在这里列出不使用该字段时的实现
    with tmp as(  select a.id,a.departmentname,a.parentid,a.path,a.sort ,a.series,level leaf        
      from T_DEPARTMENT a                
      start with a.parentid is null     
      connect by a.parentid = prior a.id)
select *                               
from tmp                             
where leaf = (select leaf from tmp where id ='b827f741ed444b1a971d1c67fa1b5ee8');

你可能感兴趣的:(sql,Oracle)