有数据如下:
Num name prenum
1 南京 NULL
2 东山 3
3 江宁 1
4 世纪联华 2
…………
提示: 1. Prenum 表示 该纪录代表的地方 属于 哪个地方
(江宁属于南京 , 东山属于江宁 )
2. 纪录可以多于4条
要求: 将数据 按照 隶属关系 整理为
1 南京 3 江宁 2 东山 4 世纪联华 ………
并且 力求 sql 高效率
请诸位高手指教。。
Num name prenum
1 南京 NULL
2 东山 3
3 江宁 1
4 世纪联华 2
…………
提示: 1. Prenum 表示 该纪录代表的地方 属于 哪个地方
(江宁属于南京 , 东山属于江宁 )
2. 纪录可以多于4条
要求: 将数据 按照 隶属关系 整理为
1 南京 3 江宁 2 东山 4 世纪联华 ………
并且 力求 sql 高效率
请诸位高手指教。。
會不會有以下數據這種情況,如果有,希望得到怎樣的結果??
Num name prenum
1 南京 NULL
2 东山 1
3 江宁 1
4 世纪联华 2
5 AAAA 2
6 BBBB 3
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 世纪联华
*/
问题是简化了,如果存在一对多的关系的话
就要按照层级来整理了
南京(1) 江宁(2) AAA(2) 东山(3) BBB(3) ccc(3) .........
针对上面的那个简化后的问题 ,
原来的要求,使用一句sql 来完成。
所以,大家想想 ,有没有更简单的写法了
--建立測試環境
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
*/