name ID PID
广东省 888 0
深圳市 853 888
南山区 566 853
罗湖区 588 853
广州市 876 888
越秀区 788 876
天河区 775 876要打印的结果是广东省
-深圳市
--南山区
--罗湖区
-广州市
--越秀区
--天河区
'-'横杆可以去掉主要是方便大家看,只要按顺序就可以了,请大家帮忙
广东省 888 0
深圳市 853 888
南山区 566 853
罗湖区 588 853
广州市 876 888
越秀区 788 876
天河区 775 876要打印的结果是广东省
-深圳市
--南山区
--罗湖区
-广州市
--越秀区
--天河区
'-'横杆可以去掉主要是方便大家看,只要按顺序就可以了,请大家帮忙
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,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM @t
WHERE PID IS NULL
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM @t a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END--显示结果
SELECT SPACE(b.Level*2)+'|--'+a.Name
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
|--山东省
|--烟台市
|--招远市
|--青岛市
|--四会市
|--清远市
|--小分市
--*/
--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (name NVARCHAR(6),ID INT,PID INT)
INSERT INTO #T
SELECT '广东省','888','0' UNION ALL
SELECT '深圳市','853','888' UNION ALL
SELECT '南山区','566','853' UNION ALL
SELECT '罗湖区','588','853' UNION ALL
SELECT '广州市','876','888' UNION ALL
SELECT '越秀区','788','876' UNION ALL
SELECT '天河区','775','876'--SQL查询如下:;WITH CTE
AS
(
SELECT name,ID,level=1,
path=CAST(name AS NVARCHAR(1000))
FROM #T
WHERE PID=0
UNION ALL
SELECT t.name,t.id,c.level+1,
CAST(c.path+t.name AS NVARCHAR(1000))
FROM CTE AS c
JOIN #T AS t
ON c.ID=t.PID
)
SELECT REPLICATE('--',level)+name AS Name
FROM CTE
ORDER BY path/*
Name
---------------------
--广东省
----广州市
------天河区
------越秀区
----深圳市
------南山区
------罗湖区(7 行受影响)*/