Jerarquía de árbol de SQL Server y conjuntos anidados con ID de registro duplicados
Dado que tengo esta estructura de conjunto de resultados (los campos superfluos han sido eliminados)
Id | ParentId | Name | Depth
----------------------------
es posible tener los registros devueltos en orden de árbol, es decir,Parent
entoncesChildren
, si unChild
es unParent
, entonces suChildren
, si no entoncesSibling
, etc? Por ejemplo,
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 */
La única forma en que puedo pensar en hacer esto sería seguir este artículo:
Mejora el rendimiento de la jerarquía utilizando conjuntos anidados
e incluir[LeftExtent]
y[RightExtent]
campos contra cada registro. Ahora el SQL en el artículo funciona bien cuandoIds
son únicos, pero en esta estructura de árbol particular, un registro con el mismoId
pueden aparecer en diferentes lugares dentro del árbol (elParentId
campo es diferente, obviamente). Creo que el problema está en este SQL del artículo -
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)
¿Cómo se puede alterar esto para permitir registros con duplicados?Ids
¿Se me darán los valores de [LeftExtent] y [RightExtent], o me falta una forma más fácil de devolver el conjunto de resultados en el orden que necesito?