¿Hay alguna manera de atravesar los datos del árbol en SQL? Lo sé connect by
en Oracle, pero ¿hay otra manera de hacer esto en otras implementaciones de SQL? Lo pregunto porque usar connect by
es más fácil que escribir un bucle o una función recursiva para ejecutar la consulta para cada resultado.
Dado que algunas personas parecen estar confundidas por la frase "datos de árbol", explicaré más a fondo: lo que quiero decir es con respecto a las tablas que tienen un parent_id
campo o un campo similar que contiene una clave primaria de otra fila en la misma tabla.
La pregunta proviene de una experiencia en la que estaba trabajando con datos almacenados de esta manera en una base de datos Oracle y sabía que connect by
no está implementado en otros DBMS. Si se usara SQL estándar, se tendría que crear un nuevo alias de tabla para cada padre que se quiera subir. Esto podría salirse fácilmente de control.
fuente
Respuestas:
El libro de Celko es un buen recurso, aunque a veces es un poco "académico".
También he encontrado que este método , conocido como 'tablas de cierre', funciona bastante bien.
Si está utilizando una base de datos que permite CTE recursivos (como PostgreSQL 8.4 o posterior , o SQL Server 2005 o posterior ), son realmente la mejor opción . Si estás en Oracle, siempre existe el venerable "conectar por" .
Según mi experiencia, es mucho más común que le entreguen un conjunto de tablas en un esquema de "árbol ingenuo", y tenga que descubrir cómo extraer el árbol correcto de ese almacenamiento, que tener la oportunidad de crear el limpiador Estructura de "mesas de cierre".
fuente
Un CTE recursivo será su solución más fácil. SQL Server 2005 y las versiones actuales de PostgreSQL admiten CTE. Si está utilizando SQL Server 2008 o más reciente, puede usar el
HIERARCHYID
tipo de datos. Puede encontrar un buen ejemplo de esto en HierarchyID: Modele sus jerarquías de datos con SQL Server 2008Recursos adicionales:
fuente
En SQL Server (2005 y ediciones posteriores) puede usar expresiones de tabla comunes para leer jerarquías, consulte Microsoft SQL Server 2005 - CTE Ejemplo de una jerarquía simple para ver un par de ejemplos.
Joe Celko me recomendó un libro sobre el tema en general que es "Árboles y jerarquías en SQL para Smarties", aunque todavía no lo he mirado.
fuente
El método SQL estándar es una "consulta recursiva" que proporciona el CTE recursivo y se designa como
WITH [ RECURSIVE ]
en la consulta. La implementación no se especifica en la especificación, solo los métodos disponibles para consultar estructuras que son recursivas. En el caso más simple, la implementación de la estructura de datos solo requiere una ID y una ID principal en una fila.También hay muchas soluciones específicas de RDBMS: por ejemplo, PostgreSQL admite CTE recursivos, pero también
ltree
proporciona un conjunto diferente de ventajas y desventajas en la implementación.Puede encontrar más información en este sitio buscando a través de la etiqueta de jerarquía .
fuente