请问如何由下列数据
父层 子层
A
A A1
A1 B1
A1 B2
A1 B3
B1 C1
B1 C2
B2 C3
B3 C4
查询得出下列结果
归属 层次 父层 子层
A 0 A
A ├1 A A1
A │├2 A1 B1
A │├2 A1 B2
A │├2 A1 B3
A ││├3 B1 C1
A ││├3 B1 C2
A ││├3 B2 C3
A ││├3 B3 C4

解决方案 »

  1.   

    --测试环境DECLARE @T TABLE(父层 VARCHAR(10),子层 VARCHAR(10))
    INSERT INTO @T SELECT '','A'
    UNION ALL SELECT 'A','A1'
    UNION ALL SELECT 'A1','B1'
    UNION ALL SELECT 'A1','B2'
    UNION ALL SELECT 'A1','B3'
    UNION ALL SELECT 'B1','C1'
    UNION ALL SELECT 'B1','C2'
    UNION ALL SELECT 'B2','C3'
    UNION ALL SELECT 'B3','C4';
    DECLARE @A VARCHAR(20)
    SET @A='A';
    WITH CTE_T(归属,层次,父层,子层)
    AS
    (SELECT 归属=@A,0,父层,子层
     FROM @T 
     WHERE 子层=@A AND 父层=''
     UNION ALL
     SELECT 归属=@A,层次=层次+1,A.父层,A.子层
     FROM @T A INNER JOIN CTE_T B
     ON A.父层=B.子层
    )
    SELECT * FROM CTE_T--结果
    /*
    归属                   层次          父层         子层
    -------------------- ----------- ---------- ----------
    A                    0                      A
    A                    1           A          A1
    A                    2           A1         B1
    A                    2           A1         B2
    A                    2           A1         B3
    A                    3           B3         C4
    A                    3           B2         C3
    A                    3           B1         C1
    A                    3           B1         C2(9 行受影响)*/
      

  2.   

    --SQL server 2000 你就用函数,有很多例子了.
      

  3.   

    服务器: 消息 156,级别 15,状态 1,行 13
    在关键字 'WITH' 附近有语法错误。
      

  4.   

    create table  A (父层 VARCHAR(10),子层 VARCHAR(10))
    INSERT INTO A SELECT '','A'
    UNION ALL SELECT 'A','A1'
    UNION ALL SELECT 'A1','B1'
    UNION ALL SELECT 'A1','B2'
    UNION ALL SELECT 'A1','B3'
    UNION ALL SELECT 'B1','C1'
    UNION ALL SELECT 'B1','C2'
    UNION ALL SELECT 'B2','C3'
    UNION ALL SELECT 'B3','C4';select * from A
    create Function F1(@Z varchar(10))
    returns varchar(10)
    as
    begin
     declare @F varchar(10)
     select @F=父层 from A where 子层=@Z
     while @@rowcount>0
     begin
       if @F=''
         begin
          set @F=@Z
          break
         end
       else 
        select @F=父层,@Z=子层  from A where 子层=@F 
     end
     return @F
    end
    create Function F2(@Z varchar(10))
    returns varchar(10)
    as
    begin
     declare @F varchar(10)
     declare @i int
     declare @lev int
     set @lev=-1
     select @F=父层 from A where 子层=@Z
     while @@rowcount>0
     begin
        set @lev=@lev+1
        select @F=父层 from A where 子层=@F 
     end
     if @lev=0 
        set @F='0'
     else
        begin
          set @F=''
          set @i=@lev
          while (@lev>0)
          begin
             set @F=@F+'| '
             set @lev=@lev-1
          end
          set @F=RTRIM(@F)+ '-' +cast(@i as varchar) 
        end
       return @F
    end select dbo.F1(子层) as 归属,dbo.F2(子层) as 层次,* from A
      

  5.   

    由子层往父层推时,如果同一子层用到不同的父层,那样归属就全变了,变成最后一个用到子层的父层了,详见下面...
    归属     层次     父层     子层
    A 0 NULL A
    A |-1 A A1
    A | |-2 A1 B1
    A | |-2 A1 B2
    A | |-2 A1 B3
    A | | |-3 B1 C1
    A | | |-3 B1 C2
    A | | |-3 B2 C3
    A | | |-3 B3 C4
    B 0 NULL B
    C |-1 B D1
    C | |-2 D1 E1
    C | |-2 D1 E2
    C | |-2 D1 E3
    C |-1 B D2
    C | |-2 D2 E4
    C | |-2 D2 E5
    C |-1 E5 E7
    C |-1 E5 E7
    C 0 NULL C
    C |-1 C D1
    C |-1 C D2
    C |-1 C D3
    C |-1 C E7
    C | |-2 E7 F1