BOMMD 
MD001(主件品号),MD003 元件
H                    AA                    B
A                    CB                    C
B                    D我想查询出来的树是这样的效果H A
A B
B C
B D
A C
也就是说,如果元件还有BOM,那么下阶直接在他下面展示
因为B还有下阶,所以在他的下面,直接将B开头的在B下面展开,如果C下面有BOM,同样的就在右边出现C的下一行显示B的BOM特别强调,不要以下效果
H A
A B
A C
B C
B D

解决方案 »

  1.   

    A                                         C B                                         C 
    ----------------------
    你这数据是错的吧?
    C怎么可以同时对应A,又对应B呢?
      

  2.   


    如果只有三层。可以用游标来实现:
    create table bommd(md001 varchar(10),md003 varchar(3))
    insert into bommd select 'H','A'
    insert into bommd select 'A','B'
    insert into bommd select 'A','C'
    insert into bommd select 'B','D'
    insert into bommd select 'B','E'
    insert into bommd select 'C','F'
    insert into bommd select 'C','G'
    declare @md001 varchar(10)
    declare @md003 varchar(10)
    declare @temp table(md001 varchar(10),md003 varchar(3))
    insert into @temp select * from bommd a where not exists(select * from bommd where md003=a.md001)--根节点
    declare cur cursor for select * from bommd where md001 =(select md003 from @temp)
    open cur
    fetch next from cur into @md001,@md003
    while(@@fetch_status=0)
    begin
    insert into @temp values (@md001,@md003)
    if exists(select * from bommd where md001=@md003)
    begin
    insert into @temp select * from bommd where md001=@md003
    end
    fetch next from cur into @md001,@md003
    end
    close cur
    deallocate cur
    select * from @temp
      

  3.   

    C是材料呀,可以用到两个地方。
    例如:
    C=螺丝
    B=光驱
    A=电脑
    可以同时用到呀
      

  4.   


    CREATE TABLE T
    (
     MD001 VARCHAR(20),
     MD003 VARCHAR(20)
    )INSERT INTO T
    SELECT 'H','A' UNION ALL
    SELECT 'A','B' UNION ALL
    SELECT 'A','C' UNION ALL
    SELECT 'B','C' UNION ALL
    SELECT 'B','D'GOCREATE FUNCTION F_SORT()
    RETURNS  @t TABLE (T_ID INT IDENTITY(1,1),ID VARCHAR(20) ,M01 VARCHAR(20),M02 VARCHAR(20), LVL INT)
    AS
    BEGIN
      DECLARE @i INT
       SET @i = 0
       INSERT INTO @t(M01,M02,LVL)
         SELECT *,@i FROM t A WHERE NOT EXISTS ( SELECT * FROM t WHERE MD003 = A.MD001)
       UPDATE A SET ID = (SELECT RIGHT(100000+COUNT(1),2) FROM @t WHERE T_ID<A.T_ID)
         FROM @t A
         
      WHILE EXISTS ( SELECT * FROM @t A,t B WHERE A.M02 = B.MD001 AND A.LVL = @i)
       BEGIN
        INSERT INTO @t
         SELECT A.ID,B.*,@i+1 FROM @t A,t B WHERE A.M02 = B.MD001 AND A.LVL = @i
       UPDATE A SET ID = ID+(SELECT RIGHT(100000+COUNT(1),2) FROM @t WHERE T_ID<A.T_ID)
         FROM @t A WHERE LVL = @i+1
         SET @i = @i + 1
       END
     
       RETURN
    END
    GOSELECT M01,M02 FROM DBO.F_SORT() ORDER BY ID  DROP FUNCTION F_SORT
    DROP TABLE TM01                  M02                  
    -------------------- -------------------- 
    H                    A
    A                    B
    B                    C
    B                    D
    A                    C(所影响的行数为 5 行)
      

  5.   

    我测出的结要怎么有11行
    H A
    A B
    B C
    B D
    A C
    A B
    B C
    B D
    A C
    B C
    B D
      

  6.   

    借用楼主的数据:
    create table bommd(md001 varchar(10),md003 varchar(10))
    insert into bommd select 'H','A'
    insert into bommd select 'A','B'
    insert into bommd select 'A','C'
    insert into bommd select 'B','D'
    insert into bommd select 'B','E'
    insert into bommd select 'C','F'
    insert into bommd select 'C','G'go
    DECLARE @T table(md001 varchar(10),md003 varchar(10),lev int,[Order] varchar(8000))
    DECLARE @lev int
    SET @Lev=0
    INSERT @T SELECT md001,md003,@Lev,md001
    FROM bommd t
    WHERE not exists(select 1 from bommd where md003=t.md001)
    WHILE @@ROWCOUNT>0
    BEGIN
    SET @Lev=@Lev+1
    INSERT @T SELECT a.md001,a.md003,@Lev,b.[Order]+a.md001
    FROM bommd a,@T b
    WHERE a.md001=b.md003
    AND b.Lev=@Lev-1
    ENDSELECT a.md001,a.md003
    FROM bommd a,@T b
    WHERE a.md001=b.md001
    group by a.md001,a.md003,b.[Order]
    ORDER BY b.[Order](所影响的行数为 1 行)
    (所影响的行数为 2 行)
    (所影响的行数为 4 行)
    (所影响的行数为 0 行)md001      md003 
    ---------- ----- 
    H          A
    A          B
    A          C
    B          D
    B          E
    C          F
    C          G(所影响的行数为 7 行)
      

  7.   

    上面拼错改一下:
    create table bommd(md001 varchar(10),md003 varchar(10))
    insert into bommd select 'H','A'
    insert into bommd select 'A','B'
    insert into bommd select 'A','C'
    insert into bommd select 'B','D'
    insert into bommd select 'B','E'
    insert into bommd select 'C','F'
    insert into bommd select 'C','G'go
    DECLARE @T table(md001 varchar(10),md003 varchar(10),lev int,[Order] varchar(8000))
    DECLARE @lev int
    SET @Lev=0
    INSERT @T SELECT md001,md003,@Lev,md001+md003
    FROM bommd t
    WHERE not exists(select 1 from bommd where md003=t.md001)
    WHILE @@ROWCOUNT>0
    BEGIN
    SET @Lev=@Lev+1
    INSERT @T SELECT a.md001,a.md003,@Lev,b.[Order]+a.md003
    FROM bommd a,@T b
    WHERE a.md001=b.md003
    AND b.Lev=@Lev-1
    ENDSELECT  a.md001,a.md003
    FROM bommd a,@T b
    WHERE a.md003=b.md003
    group by b.[Order],a.md001,a.md003
    ORDER BY b.[Order](所影响的行数为 1 行)
    (所影响的行数为 2 行)
    (所影响的行数为 4 行)
    (所影响的行数为 0 行)md001      md003 
    ---------- ----- 
    H          A
    A          B
    B          D
    B          E
    A          C
    C          F
    C          G(所影响的行数为 7 行)