Eu tenho esta tabela que representa a hierarquia:
childID parentID NAME siblingOrder
1 1 a 0
212 1 ab 1
112 1 ac 2
412 1 ad 3
-912 112 aca 0
A estrutura é:
a
+----ab
+----ac
+---aca
+----ad
(A siblingOrder
coluna é para controlar a ordem de ab
, ac
, ad
)
Eu já tenho essa solução que usa o siblingOrder
:
;WITH CTE AS(
SELECT childID, parentID, 0 AS depth, NAME , siblingOrder,
CAST(RIGHT('00000' + CAST(siblingOrder AS VARCHAR(6)), 6) AS VARCHAR(1024)) AS PATH
FROM @myTable
WHERE childID = parentID
UNION ALL
SELECT TBL.childID, TBL.parentID,
CTE.depth + 1 , TBL.name ,TBL.siblingOrder,
CAST(cte.Path + '.' + RIGHT('00000' + CAST(Tbl.siblingOrder AS VARCHAR(6)), 6)AS VARCHAR(1024) )
FROM @myTable AS TBL
INNER JOIN CTE ON TBL.parentID = CTE.childID
WHERE TBL.childID<>TBL.parentID
)
SELECT path,depth, childID, parentID, siblingOrder, REPLICATE('----', depth) + name
FROM CTE
ORDER BY PATH
Então order by
PATH
, na verdade, faça o trabalho:
O problema:
O problema é que devo (!) colocar valores no siblingOrder
para que funcione!
Caso contrário, por exemplo:
Se eu colocar 0
tudo siblingOrder
isso é o resultado:
(sim, agora classificando por caminho - não funciona...)
Eu preciso que aca
sempre estará sobac
(A única razão pela qual adicionei siblingOrder
é para pedir irmãos!) e não quero forçar a adição siblingOrder
quando não for necessário
Pergunta :
É possível aprimorar a consulta para que siblingOrder
afete apenas os irmãos?
Quero dizer , se eu não me importo com a ordem dos irmãos ( colocando 0
) , ainda espero aca
que eles estejam sobac
Você precisa incluir o
parentID
echildID
no caminho. Então, em vez devocê deveria escrever
(Isso está em dois lugares no seu código)
Usado dessa forma, você pode fornecer o siblingOrder onde desejar. Se presente, substituirá a ordem secundária. Se não estiverem presentes, as crianças serão ordenadas por seu childID.
SQL Fiddle sem irmãoOrder
Configuração do esquema do MS SQL Server 2008 :
Consulta 1 :
Resultados :
SQL Fiddle com irmãoOrder
Configuração do esquema do MS SQL Server 2008 :
Consulta 1 :
Resultados :