使用 MS SQL 服务器存储过程的 ORDER BY child-parent hierarchy
ORDER BY child-parent hierarchy using MS SQL Server stored procedure
我有一个名为 Department
的 table,有 3 列:DepartmentID
、DepartmentName
、ParentID
。
详情见SQL Fiddle
我想按 ParentID 和 Generation 对结果进行排序。像这样:
╔═════════╦════════════════╦════════════╦═════════ ═╗
║ ChildID ║ DepartmentName ║ Generation ║ ParentID ║
╠═════════╬════════════════╬════════════╬═════════ ═╣
║ 1 ║ 经理 ║ 0 ║ NULL ║
║ 6 ║ 销售额 ║ 1 ║ 1 ║
║ 7 ║ 舰队 ║ 1 ║ 1 ║
║ 4 ║ 货物 ║ 2 ║ 7 ║
║ 5 ║ 运输 ║ 2 ║ 7 ║
║ 2 ║ 它 ║ 2 ║ 6 ║
║ 3 ║ 食物 ║ 2 ║ 6 ║
╚═════════╩════════════════╩════════════╩═════════ ═╝
我尝试了不同的 ORDER BY
,但 none 成功了。
我的存储过程:
WITH Hierarchy(ChildId, DeparmentName, Generation, ParentID)
AS
(
SELECT DepartmentID, DeparmentName, 0, ParentID
FROM Departments AS FirtGeneration
WHERE ParentID IS NULL
UNION ALL
SELECT NextGeneration.DepartmentID, NextGeneration.DeparmentName, Parent.Generation + 1, Parent.ChildId
FROM Departments AS NextGeneration
INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentID = Parent.ChildId
)
SELECT * FROM Hierarchy
OPTION(MAXRECURSION 32767)
我使用 MS SQL Server 2005
尝试将 路径 存储到分层查询的顶部:
WITH Hierarchy(ChildId, DeparmentName, Generation, ParentID, Path) AS (
SELECT DepartmentID, DepartmentName, 0, ParentID,
RIGHT('000' + CAST(DepartmentID as VARCHAR(MAX)), 3) as Path
FROM Departments FirstGeneration
WHERE ParentID IS NULL
UNION ALL
SELECT NextGeneration.DepartmentID, NextGeneration.DeparmentName, Parent.Generation + 1, Parent.ChildId,
Path + '-->' + CAST(RIGHT('000' + CAST(NextGeneration.DepartmentID as VARCHAR(MAX)), 3)
FROM Departments NextGeneration INNER JOIN
Hierarchy Parent
ON NextGeneration.ParentID = Parent.ChildId
)
SELECT h.*
FROM Hierarchy h
ORDER BY path
OPTION(MAXRECURSION 32767);
我有一个名为 Department
的 table,有 3 列:DepartmentID
、DepartmentName
、ParentID
。
详情见SQL Fiddle
我想按 ParentID 和 Generation 对结果进行排序。像这样:
╔═════════╦════════════════╦════════════╦═════════ ═╗
║ ChildID ║ DepartmentName ║ Generation ║ ParentID ║
╠═════════╬════════════════╬════════════╬═════════ ═╣
║ 1 ║ 经理 ║ 0 ║ NULL ║
║ 6 ║ 销售额 ║ 1 ║ 1 ║
║ 7 ║ 舰队 ║ 1 ║ 1 ║
║ 4 ║ 货物 ║ 2 ║ 7 ║
║ 5 ║ 运输 ║ 2 ║ 7 ║
║ 2 ║ 它 ║ 2 ║ 6 ║
║ 3 ║ 食物 ║ 2 ║ 6 ║
╚═════════╩════════════════╩════════════╩═════════ ═╝
我尝试了不同的 ORDER BY
,但 none 成功了。
我的存储过程:
WITH Hierarchy(ChildId, DeparmentName, Generation, ParentID)
AS
(
SELECT DepartmentID, DeparmentName, 0, ParentID
FROM Departments AS FirtGeneration
WHERE ParentID IS NULL
UNION ALL
SELECT NextGeneration.DepartmentID, NextGeneration.DeparmentName, Parent.Generation + 1, Parent.ChildId
FROM Departments AS NextGeneration
INNER JOIN Hierarchy AS Parent ON NextGeneration.ParentID = Parent.ChildId
)
SELECT * FROM Hierarchy
OPTION(MAXRECURSION 32767)
我使用 MS SQL Server 2005
尝试将 路径 存储到分层查询的顶部:
WITH Hierarchy(ChildId, DeparmentName, Generation, ParentID, Path) AS (
SELECT DepartmentID, DepartmentName, 0, ParentID,
RIGHT('000' + CAST(DepartmentID as VARCHAR(MAX)), 3) as Path
FROM Departments FirstGeneration
WHERE ParentID IS NULL
UNION ALL
SELECT NextGeneration.DepartmentID, NextGeneration.DeparmentName, Parent.Generation + 1, Parent.ChildId,
Path + '-->' + CAST(RIGHT('000' + CAST(NextGeneration.DepartmentID as VARCHAR(MAX)), 3)
FROM Departments NextGeneration INNER JOIN
Hierarchy Parent
ON NextGeneration.ParentID = Parent.ChildId
)
SELECT h.*
FROM Hierarchy h
ORDER BY path
OPTION(MAXRECURSION 32767);