Учитывая, что у меня есть эта структура набора результатов (лишние поля были удалены)
Id | ParentId | Name | Depth
----------------------------
возможно ли вернуть записи в древовидном порядке, то есть Parent
, затем Children
, если Child
- это Parent
, то их Children
, если нет, то Sibling
и т. Д.? Например,
Id | ParentId | Name | Depth
----------------------------
1 NULL Major 1
2 1 Minor 2
3 1 Minor 2
4 3 Build 3
5 3 Build 3
6 1 Minor 2
/* etc, etc */
Единственный способ, которым я могу думать об этом, - это следовать этой статье -
Улучшение производительности иерархии с помощью вложенных наборов
и включите поля [LeftExtent]
и [RightExtent]
для каждой записи. Теперь SQL в статье работает нормально, когда Ids
уникальны, но в этой конкретной древовидной структуре запись с одинаковым Id
может появляться в разных местах дерева (очевидно, что поле ParentId
отличается). Я думаю, что проблема в этом SQL из статьи -
INSERT INTO @tmpStack
(
EmployeeID,
LeftExtent
)
SELECT TOP 1 EmployeeID, @counter
FROM Employee
WHERE ISNULL(ParentID, 0) = ISNULL(@parentid,0)
/* If the Id has already been added then record is not given [LeftExtent] or [RightExtent] values. */
AND EmployeeID NOT IN (SELECT EmployeeID FROM @tmpStack)
Как это можно изменить, чтобы позволить записям с дубликатами Ids
получить значения [LeftExtent] и [RightExtent], или я полностью упускаю более простой способ вернуть набор результатов в требуемом порядке?