Oracle中start with…connect by prior子句用法

Oracle中start with…connect by prior子句用法

情景:在数据库中经常会遇到查找树状结构的数据。比如一个公司,从高层领导到基层员工,每个人都有自己的员工号(主键id),以及自己的直接领导上司(boss_id),现在需要查找公司的所有员工,并遵守从上到下,从领导到直接下属的树形进行查询。 如A有两个直接下属A1、A2,A1又有直接下属A11、A12,A2又有直接下属A21、A22、A23…现在就需要查询A和他的直接下属,以及他的直接下属的直接下属,直到查询到没有直接下属为止。

格式:

select 
        * 
from 
        tableName a 
where 
        a.name = '小明' 
start with 
        a.id = 1 
connect by 
        prior a.id = a.boss_id
order by
        a.age desc;

子节点列和父节点列

id列为子节点列
boss_id列为父节点列

一般情况下start with 后面接子节点列

找员工[向下查询]:

select * from employee e start with e.id = 'A' connect by  prior e.id = e.boss_id;

prior:
    英文意思:优先的; 占先的; 在…之前;

start with :
    表示从e.id = 'A'开始进行查询,A表示根节点(最高领导,从A向下查找员工)

connect by prior e.id = e.boss_id:
    表示父数据的id=子数据的boss_id
或
    上一级数据的id=本级数据的boss_id

找领导[向上查询]:

select * from employee e start with e.id = 'A23' connect by  e.id = prior e.boss_id;

start with :
    表示从e.id = 'A23'开始进行查询,A23表示根节点(从A23开始查找领导)

connect by e.id = prior e.boss_id:
    表示父数据的boss_id=子数据的id
或
    上一级数据的boss_id=本级数据的id

难点1

其实就是prior关键词的用法(心里想象着这个树状图)
上一级数据的boss_id = 本级数据的id-----找领导
上一级数据的id = 本级数据的boss_id-----找员工

prior 子节点列 = 父节点列 [向下查询],prior 父节点列 = 子节点列 [向上查询]

难点2

1、start with 接的条件是查询开始条件,即第一级的数据都符合这个条件。例如后接父节点列,start with boss_id = ‘A’,会查询出boss_id=’A’的所有数据作为第一级查询结果


2、connect by prior 接的条件是查询后续条件,即非第一级的数据都符合这个条件。例如connect by prior e.id = e.boss_id[向下查询],如第一级的id是’A’,则会查询出第二级中所有boss_id=’A’的记录,以此类推


3、向上查询,start with 后接父节点列,可能会出现冗余记录:如有五条数据,分别有两个字段(id、parent_id),数据记录分别是A(第一级),B1,B2,B3,B4(第二级)。如果start with parent_id(父节点列)=A.id,即第一级会查询出parent_id是A.id的数据,即查询出A的直接子节点B1、B2、B3、B4四条数据。当查出B1时,因为是向上查询,B1的上级是A,所以会查出B1、A两条记录。同理查出B2、A、B3、A、B4、A,即A查了4次


4、建议都用向下查询,如果非要使用向上查询的话,使用子节点列作为开始查询条件,避免冗余数据的产生。当然,也要结合业务场景去使用

你可能感兴趣的:(oracle)