2010-09-16 14 views
5

Tengo una tabla con tres columnas NodeId, ParentNodeId, NodeName. para cada nodo me gustaría obtener una ruta completa como "lvl1/lvl2/lvl3 ..." donde lvl1, lvl2 y lvl3 son nombres de nodos. Encontré una función que hace eso en este enlace http://www.sql-server-helper.com/functions/get-tree-path.aspx. pero me gustaría usar CTE O cualquier otra técnica para la eficiencia. Por favor, avíseme si es posible lograr esto de una mejor manera. Gracias por adelantado.Consulta SQL para obtener la ruta de jerarquía completa

Respuesta

6

Aquí hay una versión CTE.

declare @MyTable table (
    NodeId int, 
    ParentNodeId int, 
    NodeName char(4) 
) 

insert into @MyTable 
    (NodeId, ParentNodeId, NodeName) 
    select 1, null, 'Lvl1' union all 
    select 2, 1, 'Lvl2' union all 
    select 3, 2, 'Lvl3' 

declare @MyPath varchar(100) 

;with cteLevels as (
    select t.NodeId, t.ParentNodeId, t.NodeName, 1 as level 
     from @MyTable t 
     where t.ParentNodeId is null 
    union all 
    select t.NodeId, t.ParentNodeId, t.NodeName, c.level+1 as level 
     from @MyTable t 
      inner join cteLevels c 
       on t.ParentNodeId = c.NodeId 
) 
select @MyPath = case when @MyPath is null then NodeName else @MyPath + '/' + NodeName end 
    from cteLevels 
    order by level 

select @MyPath 
+0

¿Alguna posibilidad de que me ayudes a adaptar esta respuesta para mi caso? http://stackoverflow.com/q/5549480/93202 –

0

La forma más eficiente, en mi experiencia, sería añadir un campo adicional, RootNodeID, que contiene el identificador del nodo de nivel superior de la treestructure. Para que pueda consultar todos los nodos en una estructura entera de árboles de una manera muy simple y eficiente.

Y para construir esa estructura de árbol, una función recursiva simple en su aplicación debería funcionar bien.

Sé que es la desnormalización, y algunas personas realmente no aprueban el concepto, pero he aprendido en mi experiencia profesional que esto trae un gran aumento de rendimiento, en comparación con un elaborado script t-sql.

+0

¿puede proporcionar un ejemplo de código simple para esto, por favor? – RKP

+0

¿En qué idioma te gustaría que esté? –

+0

SQL Server Transact SQL – RKP

4

Lo resolví así, muy similar a la solución de Joe.

with cte (NodeId,NodeName,hierarchyPath)as 
(
    select NodeId,NodeName, NodeName 
    from Node 
    where ParentNodeId is null 
    union all 
    select n.NodeId, n.NodeName, CONVERT(varchar(256), cte.hierarchyPath + '/' + n.NodeName) 
    from Node n 
    join cte on n.ParentNodeId = cte.NodeId 
) 

select * 
from cte 
order by NodeId 
Cuestiones relacionadas