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
5
A
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
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.
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
- 1. Cómo obtener la ruta completa de StreamWriter
- 2. Obtener una lista de archivos con la ruta completa
- 3. consulta SQL para obtener registros
- 4. Obtener ruta de archivo completa en java
- 5. ¿Cómo obtener una parte de la ruta completa en C#?
- 6. obtener la ruta completa de un PID usando Delphi
- 7. ¿Cómo comprimir solo archivos y no la jerarquía de ruta completa con DotNetZip en powershell?
- 8. Consulta SQL para obtener el último precio
- 9. consulta SQL para obtener mayor brevedad
- 10. Jerarquía de datos SQL
- 11. ¿Cómo devolver la ruta completa de SaveFileDialog?
- 12. Obtener SQL String de la consulta de Hibernate
- 13. Cómo recuperar la jerarquía de roles completa en Symfony
- 14. Obtener los nombres de archivo sólo de ruta completa
- 15. SQL Server: Obtener la clave principal tabla mediante consulta SQL
- 16. Comando de shell de Windows para obtener la ruta completa al directorio actual?
- 17. optimización de una consulta SQL para evitar la mesa de exploración completa del
- 18. Obteniendo la ruta completa para el servicio de Windows
- 19. ¿Obtener la ruta/url de la acción actual incluyendo la cadena de consulta? (Rails)
- 20. decodificar tinyurl en R para obtener la ruta completa de url?
- 21. nodo raíz get T-SQL en la jerarquía
- 22. Verifique si se proporcionó la ruta completa
- 23. ¿Puedo obtener la consulta completa de que un PreparedStatement está a punto de ejecutarse?
- 24. Obtener la URL completa para un controlador y acción?
- 25. ¿Cómo puedo obtener MSBUILD para evaluar e imprimir la ruta completa cuando se le da una ruta relativa?
- 26. python tarfile sin ruta completa
- 27. Obtener la ruta completa sin el nombre de archivo de la ruta que incluye el nombre de archivo
- 28. sql consulta para obtener contenido anterior a 3 semanas
- 29. Cómo ver la consulta completa de SHOW PROCESSLIST
- 30. T-SQL: ¿la mejor manera de copiar datos de jerarquía?
¿Alguna posibilidad de que me ayudes a adaptar esta respuesta para mi caso? http://stackoverflow.com/q/5549480/93202 –