WITH t AS ( SELECT ID , department , pid , CONVERT(VARCHAR(1000), RIGHT('000000' + CONVERT(VARCHAR(20), ROW_NUMBER() OVER ( ORDER BY department )), 6)) AS PATH , 1 AS LEVEL FROM dbo.department WHERE pid IS NULL UNION ALL SELECT dbo.department.ID , dbo.department.department , dbo.department.pid , CONVERT(VARCHAR(1000), PATH + '-' + RIGHT('000000' + CONVERT(VARCHAR(20), ROW_NUMBER() OVER ( ORDER BY dbo.department.department )), 6)) AS PATH , t.level + 1 AS LEVEL FROM dbo.department INNER JOIN t ON department.pid = t.id ) SELECT * FROM t ORDER BY Path
其中PATH将行号(同级按名称排序)进行了格式化,以方便后期排序