tipo nodos leer dato consulta campo sql data-structures tree firebird

leer - Localizando todos los nodos accesibles usando SQL



leer nodos xml sql (3)

Supongamos una tabla con dos columnas: From y To. Ejemplo:

From To 1 2 2 3 2 4 4 5

Me gustaría saber la forma más efectiva de localizar todos los nodos a los que se puede acceder desde un nodo mediante una consulta SQL. Ejemplo: dado 1 devolvería 2,3,4 y 5. Es posible usar varias consultas unidas por cláusulas UNION, pero limitaría la cantidad de niveles que se pueden alcanzar. Quizás una estructura de datos diferente haría el problema más manejable, pero esto es lo que está disponible.

Estoy usando Firebird, pero me gustaría tener una solución que solo use SQL estándar.


Con SQL estándar, la única forma de almacenar un árbol con un rendimiento de lectura aceptable es mediante el uso de un hack como la enumeración de ruta. Tenga en cuenta que esto es muy pesado en las escrituras.

ID PATH 1 1 2 1;2 3 1;2;3 4 1;2;4 SELECT * FROM tree WHERE path LIKE ''%2;%''


Lamentablemente, no hay una buena solución genérica para esto que funcione para todas las situaciones en todas las bases de datos.

Recomiendo que mires estos recursos para una solución MySQL:

Para PostgreSQL y SQL Server debería echar un vistazo a los CTE recursivos .

Si está utilizando Oracle, debe consultar CONNECT BY, que es una extensión patentada de SQL que facilita enormemente el manejo de estructuras de árbol.


Puede usar una expresión de tabla común recursiva si usa la mayoría de las marcas de bases de datos, excepto MySQL y SQLite y algunas otras más oscuras (lo siento, considero Firebird oscuro). Esta sintaxis es estándar ANSI SQL, pero Firebird aún no lo admite.

Corrección: Firebird 2.1 admite CTE recursivos, como comenta @Hugues Van Landeghem.

De lo contrario, consulte mis Modelos de presentación para datos jerárquicos con SQL para diferentes enfoques.

Por ejemplo, puede almacenar filas adicionales para cada ruta en su árbol, no solo las rutas padre / hijo inmediatas. Yo llamo a este diseño Closure Table .

From To Length 1 1 0 1 2 1 1 3 2 1 4 2 1 5 3 2 2 0 2 3 1 2 4 1 3 3 0 4 4 0 4 5 1 5 5 0

Ahora puede consultar SELECT * FROM MyTable WHERE From = 1 y obtener todos los descendientes de ese nodo.

PD: Evitaría nombrar una columna From , porque es una palabra SQL reservada.