Hierarquia de Árvore do SQL Server e Conjuntos Aninhados com IDs de Registro Duplicados
Dado que eu tenho essa estrutura de resultados (campos supérfluos foram retirados)
Id | ParentId | Name | Depth
----------------------------
é possível ter os registros retornados em ordem de árvore, ou seja,Parent
entãoChildren
, se umChild
é umParent
, então a suaChildren
, se não entãoSibling
, etc? Por exemplo,
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 */
A única maneira que eu posso pensar em fazer isso seria seguir este artigo -
Melhore o desempenho da hierarquia usando conjuntos aninhados
e incluir[LeftExtent]
e[RightExtent]
campos contra cada registro. Agora o SQL no artigo funciona bem quandoIds
são únicos, mas nesta estrutura de árvore particular, um registro com o mesmoId
pode aparecer em lugares diferentes dentro da árvoreParentId
campo é diferente, obviamente). Eu acho que o problema está neste SQL do artigo -
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)
Como isso pode ser alterado para permitir registros com duplicadoIds
a ser dado valores [LeftExtent] e [RightExtent], ou estou completamente perdendo uma maneira mais fácil de retornar o conjunto de resultados na ordem que eu preciso?