1

У меня есть таблица с именем Department с 3 колонками: DepartmentID, DepartmentName, ParentID.ORDER BY дочерняя иерархия с использованием хранимой процедуры MS SQL Server

См SQL Fiddle подробности

Я хочу заказать результаты по ParentID и генерации. Например:
╔═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ ═ ═ ═ ═ ║ ║ ║ ═ ═
║ ChildID ║ DepartmentName ║ Generation ║ ParentID ║
╠ = = = = = = = = = ══════════╬══════════╣
║ 1 ║ ║ Менеджер 0 ║ ║ NULL
║ ║ 6 продаж ║ 1 ║ 1 ║
║ ║ 7 Fleet ║ 1 ║ 1 ║
║ 4 ║ Груз ║ 2 ║ 7 ║
║ 5 ║ ║ Транспорт 2 ║ ║ 7
║ ║ 2 IT-║ ║ 2 6 ║ ║
3 ║ ║ еды 2 ║ ║ 6
╚═════════╩═════ = 0 =

Я пробовал разные ORDER BY с, но никто не работал.

Моя хранимая процедура:

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

ответ

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

код не запустить. Существуют некоторые синтаксические ошибки SQL. – milo2011