【问题标题】:ORDER BY child-parent hierarchy using MS SQL Server stored procedure使用 MS SQL Server 存储过程的 ORDER BY 子父层次结构
【发布时间】:2017-02-11 14:46:07
【问题描述】:

我有一个名为 Department 的表,包含 3 列:DepartmentIDDepartmentNameParentID

详情请见SQL Fiddle

我想按 ParentID 和 Generation 对结果进行排序。像这样:
╔═════════╦════════════════╦════════════╦═════════ ═╗
║ ChildID ║ DepartmentName ║ Generation ║ ParentID ║
╠═════════╬════════════════╬════════════╬═════════ ═╣
║ 1 ║ 经理 ║ 0 ║ NULL ║
║ 6 ║ 销售 ║ 1 ║ 1 ║
║ 7 ║ 舰队 ║ 1 ║ 1 ║
║ 4 ║ 货物 ║ 2 ║ 7 ║
║ 5 ║ 运输 ║ 2 ║ 7 ║
║ 2 ║ IT ║ 2 ║ 6 ║
║ 3 ║ 食物 ║ 2 ║ 6 ║
╚═════════╩════════════════╩════════════╩═════════ ═╝

我尝试了不同的ORDER BYs,但都没有成功。

我的存储过程:

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

【问题讨论】:

    标签: sql-server stored-procedures sql-server-2005 sql-order-by


    【解决方案1】:

    尝试将路径存储到分层查询的顶部:

    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);
    

    【讨论】:

    • 代码没有运行。有一些 SQL 语法错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多