Atravesar datos en forma de árbol en una base de datos relacional usando SQL


16

¿Hay alguna manera de atravesar los datos del árbol en SQL? Lo sé connect byen Oracle, pero ¿hay otra manera de hacer esto en otras implementaciones de SQL? Lo pregunto porque usar connect byes 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_idcampo 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 byno 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.


Tienes las soluciones de Joe Celko. Pocas muestras: árboles en SQL , árboles y jerarquías en Oracle , modelo de conjunto anidado . No es necesario tener azúcar de sintaxis ;-).
Marian

Respuestas:


14

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".


9

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 HIERARCHYIDtipo de datos. Puede encontrar un buen ejemplo de esto en HierarchyID: Modele sus jerarquías de datos con SQL Server 2008

Recursos adicionales:



1

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 ltreeproporciona 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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.