建表和填充记录,
create table test(superid varchar2(20),id varchar2(20));insert into test values('1','11');
insert into test values('1','12');insert into test values('2','21');
insert into test values('2','22');insert into test values('11','111');
insert into test values('11','112');insert into test values('12','121');
insert into test values('12','122');insert into test values('21','211');
insert into test values('21','212');insert into test values('22','221');
insert into test values('22','222');commit;
想通过一个sql语句查询重如下结果:
ID superid  topSuperid(最顶层ID)
1   0           0
111  11         1
211  21         2请问大家有方法么?

解决方案 »

  1.   

    superid是父节点?为什么会得到那3条记录?
      

  2.   

    这个意思?with tt as(
      select superid,'0' a,'0' b from test minus select id,'0','0' from test)
    select id,superid,connect_by_root superid topSuperid from test
    start with superid in (select superid from tt)
    connect by prior id=superid
    union all select * from tt
      

  3.   


    select a.id,a.superid,b.superid
    from test a,(select id,superid from test) b
    where a.superid = b.id
      

  4.   


    select a.id,a.superid,nvl(b.superid,0)
    from test a,(select id,nvl(superid,0) superid from test) b
    where a.superid = b.id(+)
      

  5.   

    指定节点是指?这个说明和主题中的结果不是很贴切
    主要不是很明白你需要什么,大致都能通过connect by实现
    稍微麻烦的一点就是,你给出的测试表里,根节点id没有出现,需要从superid里提取
      

  6.   

    指定节点是指?
    答:就指最底层的节点
    没错,根节点就是通过superid一级一级的取,一直取到最顶端。