141.树形数据广度排序处理-案例

40 阅读1分钟
--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001',NULL ,'山东省'
UNION ALL SELECT '002','001','烟台市'
UNION ALL SELECT '004','002','招远市'
UNION ALL SELECT '003','001','青岛市'
UNION ALL SELECT '005',NULL ,'四会市'
UNION ALL SELECT '006','005','清远市'
UNION ALL SELECT '007','006','小分市'

--广度排序显示处理
--生成每个节点的层次数据
DECLARE @t_Level TABLE(ID char(3),Level int)
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
	SET @Level=@Level+1
	INSERT @t_Level SELECT a.ID,@Level
	FROM @t a,@t_Level b
	WHERE a.PID=b.ID
		AND b.Level=@Level-1
END

--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Level,b.ID
/*--结果
ID   PID  Name       
------- --------- ---------- 
001  NULL 山东省
005  NULL 四会市
002  001   烟台市
003  001   青岛市
006  005   清远市
004  002   招远市
007  006   小分市
--*/