求SQL:如何查询树上的某个节点的根。如表:Parent            Child
AR                  A1
A1                  A2
A2                  A3
BR                  B1
B1                  B2
B2                  A3
CR                  C1
C1                  C2
C2                  C3
DR                  D1
D1                  D2
D2                  D3
D3                  A3我想用SQL查出C3和A3的最上层节点,查询结果为:
A3               AR,BR,DR
C3               CR

解决方案 »

  1.   

    select child, wm_concat(root) from (
    select child, connect_by_root parent root from t
    start with parent like '%R' connect by prior child = parent
    ) where child in ('A3','C3') group by child;
      

  2.   


    parent不一定是以R结尾,查询的输入参数只有‘A3’和‘C3’
      

  3.   

    --员工上级对应表
    --emp_Id  员工编号
    --superior_id 上级工号
    create table emp
    ( emp_Id varchar2(10), emp_name varchar2(20),   superior_id varchar2(10));insert into emp (emp_id, emp_name, superior_id)
    values(  '1101','王一山',''  );insert into emp (emp_id, emp_name, superior_id)
    values(  '1102','何少芬','1101'  );insert into emp (emp_id, emp_name, superior_id)
    values(  '1103','王纬明','1101'  );insert into emp (emp_id, emp_name, superior_id)
    values(  '1104','白梓悦','1102'  );insert into emp (emp_id, emp_name, superior_id)
    values(  '1105','李旭辉','1102'  );
    ----显示'白梓悦'的最高上级 
    select *  as emp_l from emp where connect_by_isleaf =1
      start with emp_name='白梓悦'  
     connect by prior  superior_id=emp_id;
      

  4.   

    上面输入时输错了,真是不好意思。----显示'白梓悦'的最高上级 
    select *   from emp where connect_by_isleaf =1
      start with emp_name='白梓悦'  
     connect by prior  superior_id=emp_id;
    connect_by_isleaf 这一个是oracle一个特性(伪列)
    其实还有其他的方法,条条大道能罗马,呵呵,楼主可以百度一下。
      

  5.   

    单个SQL我没有写过这样的。
    我只弄过写一个循环处理,将每一个的根结点取出。