select 父目錄,子目錄,用量,層次=1 from 表TEST1 
union 
select 父目錄,子目錄=(select 子目錄 from 表TEST1 
                      where 子目錄 in (select 子目錄 from 表TEST1) 
                        and 父目錄 in (select 子目錄 from 表TEST1)
                     ),用量,層=2 from 表TEST1

解决方案 »

  1.   

    --生成测试数据
    create table TEST1(
    父目錄  varchar(10),
    子目錄  varchar(10),
    用量    int
    )
    create table TEST2(
    目錄    varchar(10)  
    )insert into test1 select rtrim('AA'),rtrim('AAA'),2
    insert into test1 select rtrim('AA'),rtrim('AAB'),1
    insert into test1 select rtrim('AA'),rtrim('AAC'),3
    insert into test1 select rtrim('AAA'),rtrim('AAAAZ'),5
    insert into test1 select rtrim('AAA'),rtrim('AAAB'),3
    insert into test1 select rtrim('BB'),rtrim('BBA'),2
    insert into test1 select rtrim('BB'),rtrim('BBB'),2
    insert into test1 select rtrim('BBA'),rtrim('BBAAZ'),3 insert into test2 select 'AA'  
    insert into test2 select 'BB'  
    insert into test2 select 'AAA'     
    --查询
    select 
        *,
        1 as 層次 
    from 
        test1 
    where 
        父目錄 in(select 目錄 from test2)
    union all
    select 
        b.父目錄,
        a.子目錄,
        b.用量*a.用量,
        2 
    from
        test1 a,
        test1 b
    where
        a.父目錄 = b.子目錄--删除测试数据
    drop table test1
    drop table test2
      

  2.   

    謝謝兩位的回復﹐可能我沒有說清楚。這個的層次有可能達到20﹐希望程序動態根據表TEST1,生成層次。并算出對應終極父目錄(test2)對應相對子目錄的用量。
      

  3.   

    declare @level int  --層次select  assm_no,part_no ﹐qty_per,1 as idno
    into #tmpbom
    from 
    test1 where assm_no in (select assm_no form test2)
             
    set @level=1
    while @level<20
    begin 
    insert into #tmpbom
    select t.assm_no as assm_no,b.part_no, b.qty_per*t.qty_per as qty_per, @level+1 as idno 
    from test1 b (nolock)
    join #tmpbom t on t.part_no=b.assm_no
    where t.idno=@level
    if @@rowcount=0
    break
    delete t from engbomm b join #tmpbom t on t.part_no=b.assm_no where t.idno=@level
    set @level=@level+1
    end 不知道這樣行不?
      

  4.   

    select assm_no,part_no,sum(qty_per),indo from #tmpbom group by assm_no,part_no