表数据如下:
ID PUP CONTENT
1 0 a
2 1 b
3 1 c
4 2 d
5 2 e
6 3 f
7 3 g
8 5 h
9 5 j
10 8 k
我希望得到2级结构,就是除了1,2级节点外,其它的节点的ID全部换成它的第二顶级节点ID,希望得到的结果如下:
ID PUP CONTENT
1 0 a
2 1 b
3 1 c
2 2 d
2 2 e
3 3 f
3 3 g
2 5 h
2 5 j
2 8 k 请高手帮忙

解决方案 »

  1.   

    再一次描述如下:
    ID PUP CONTENT 
    1  0   a       一级节点,不变
    2  1   b       二级节点,不变
    3  1   c       二级节点,不变 
    2  2   d       三级节点,ID变成它的PUP
    2  2   e       三级节点,ID变成它的PUP 
    3  3   f       三级节点,ID变成它的PUP 
    3  3   g       三级节点,ID变成它的PUP 
    2  5   h       四级节点,ID变成它的PUP的PUP 
    2  5   j       四级节点,ID变成它的PUP的PUP
    2  8   k       五级节点,ID变成它的PUP的PUP的PUP
      

  2.   

    select 
    level, 
    sys_connect_by_path(a,','),
    decode(level,1,b,2,b,substr(sys_connect_by_path(a,','),instr(sys_connect_by_path(a,','),',',2)+1,1)),
    t.* 
    from 
    (select 1 a,0 b,'a' from dual 
    union 
    select 2 a, 1 b, 'b'  from dual 
    union 
    select 3 a, 1 b, 'c' from dual 
    union 
    select 4 a, 2 b, 'd'  from dual 
    union 
    select 5 a, 2 b, 'e'  from dual 
    union 
    select 6 a, 3 b, 'f'  from dual 
    union 
    select 7 a, 3 b, 'g'   from dual 
    union 
    select 8 a, 5 b, 'h'   from dual 
    union 
    select 9 a, 5 b, 'j'   from dual 
    union 
    select 10 a, 8 b, 'k'   from dual ) t
    connect by  prior t.a = t.b 
    start with t.b=0
      

  3.   


    -------建立测试环境
    create table Po(id int,pup int,content varchar(10))
    insert into po select 1,0,'a'
    union all select 2,1,'b'
    union all select 3,1,'c'
    union all select 4,2,'d'
    union all select 5,2,'e'
    union all select 6,3,'f'
    union all select 7,3,'g'
    union all select 8,5,'h'
    union all select 9,5,'j'
    union all select 10,8,'k'
    ---创建函数
    create function pol(@id int)
    returns int
    as
    begin
    declare @t table(id int,pup int,lev int)
    declare @i int
    set @i=1
    insert into @t select id,pup,@i from po where id in (select pup from po where id=@id)
    while(@@rowcount>0)
    begin
    set @i=@i+1
    insert into @t select b.id,b.pup,@i from @t a,po b where a.pup=b.id and a.lev=@i-1
    end
    declare @return int
    declare @cnt int
    select @cnt=count(*) from @t
    if(@cnt>=2)
    begin
    select top 1 @return=id from (select top 2 * from @t order by lev desc)a order by lev
    end
    else
    begin
    set @return=@id
    end
    return @return
    end------调用函数:
    select dbo.pol(id),pup,content from po