有数据如下:
Num               name           prenum 
1          南京       NULL
2          东山       3         
3          江宁       1         
4          世纪联华   2         
…………
提示: 1. Prenum 表示 该纪录代表的地方 属于 哪个地方 
      (江宁属于南京 , 东山属于江宁 )
      2. 纪录可以多于4条
要求: 将数据 按照 隶属关系 整理为 
       1  南京  3  江宁  2 东山  4 世纪联华 ………
      并且 力求 sql 高效率  
      请诸位高手指教。。

解决方案 »

  1.   

    一個父節點下面只有一個子節點嗎??問題簡化的太簡單了。
    會不會有以下數據這種情況,如果有,希望得到怎樣的結果??
    Num name      prenum 
    1          南京       NULL
    2          东山       1         
    3          江宁       1         
    4          世纪联华     2  
    5          AAAA      2  
    6          BBBB      3
      

  2.   

    --SQL SERVER 2005
    declare @t table(Num int ,name varchar(20),prenum int)
    insert into @t select 1,'南京',null
    union all select 2,'东山',3
    union all select 3,'江宁',1
    union all select 4,'世纪联华',2 DECLARE @S VARCHAR(8000)
    SET @S='';
    WITH CTE_T(Num,name,LEVEL)
    AS
    (SELECT NUM,NAME,0
     FROM @T 
     WHERE prenum IS NULL
     UNION ALL
     SELECT A.NUM,A.NAME,B.LEVEL+1
     FROM @T A ,CTE_T B
     WHERE A.prenum=B.Num
    )
    SELECT @S=@S+' '+CAST(NUM AS VARCHAR)+' '+NAME 
    FROM CTE_T
    PRINT @S/*
     1 南京 3 江宁 2 东山 4 世纪联华
    */
      

  3.   

    --SQL SERVER 2005 很容易实现递归功能.
      

  4.   

    to paoluo 
       问题是简化了,如果存在一对多的关系的话
       就要按照层级来整理了
       南京(1)  江宁(2) AAA(2)  东山(3)  BBB(3)  ccc(3)  .........
      

  5.   

    to everyone
       针对上面的那个简化后的问题 , 
       原来的要求,使用一句sql 来完成。
       所以,大家想想 ,有没有更简单的写法了
      

  6.   

    一句SQL,那就沒辦法了,寫函數倒是可以考慮。
      

  7.   

    不用一句sql 也可以,我只是想找到尽量简短的sql
      

  8.   

    --以下函數可得到Tree的某節點下的所有節點分層組合成的字符常串
    --建立測試環境
    Create Table Tree
    (Num  Int,
    name  Varchar(10),
    prenum   Int)
    --插入數據
    Insert Tree Select 1, 'A',Null
    Union All Select 2, 'B', 1
    Union All Select 3, 'C', 2
    Union All Select 6, 'D', 1
    Union All Select 7, 'E', 6
    Union All Select 8, 'F', 7
    Go
    --建立函數
    Create Function GetChild(@Num Int)
    Returns Varchar(8000)
    As
    Begin
    Declare @I Int
    Declare @S Varchar(8000)
    Declare @Child Table(Num Int,name Varchar(10),prenum Int,Rank Int)
    Set @I=0
    Set @S=''
    Insert @Child Select *,0 From Tree Where Num=@Num
    While @@ROWCOUNT>0
    Begin
    Select @I=@I+1
    Insert @Child Select B.*,@I From @Child A Inner Join Tree B On A.Num=B.prenum Where B.Num Not In (Select Distinct Num From @Child)
    End
    Select @S=@S+' '+Rtrim(Num)+' '+name From @Child Order By Rank,Num
    Return(Stuff(@S,1,1,''))
    End
    GO
    --測試
    Select dbo.GetChild(1)  As Child
    Select dbo.GetChild(6)  As Child
    Select dbo.GetChild(2)  As Child
    GO
    --刪除測試環境
    Drop Table Tree
    Drop Function GetChild
    Go
    --結果
    /*
    Child
    1 A 2 B 6 D 3 C 7 E 8 FChild
    6 D 7 E 8 FChild
    2 B 3 C
    */