¿Sentencia sql?

07/03/2004 - 10:37 por José Antonio | Informe spam
Buenos días a tod@s:
Tengo una tabla unidades con dos campos idUnidad(autonumerico) y
idPadre(Long). Más o menos así:
idUnidad idPadre
1 0
2 0
3 1
4 1
5 2
6 3
7 3
8 7
9 7
De tal forma que 1 es padre de 3 y de 4, 3 es padre de 6 y 7 y 7 es padre de
8
|6
|3| |8
1| |7|9
|4
Aunque está tabla no va a ser en principio muy grande ni va a haber
relaciones de muchas generaciones (no más de 4) me gustaría tener un SP que
me devolviera todos los hijos de una unidad determinada. Con la unidad 7 no
hay problema porque solo tiene una generación de hijos: Select idUnidad from
unidades where idunidad =@idUnidad or idPadre = @idUnidad.
Pero claro cuando quiero saber todos los descendientes de 3 la cosa no me
parece tan sencilla. ¿Hay alguna forma de hacerlo?.

Como esto no me salía tenía pensado llevarme el recordset con todas la
unidades hasta el cliente y allí tratarlo con alguna función recursiva y que
solo le permitiera ver los descendientes de la unida a la que él pertenece.
¿Me pueden aconsejar alguna estrategia mejor?. ¿Debería añadir un tercer
campo "LibroFamilia" (Varchar(50)) y rellenarlo mediante un trigger
idUnidad idPadre LibroFamilia
1 0
2 0
3 1 13
4 1 14
5 2 25
6 3 136
7 3 137
8 7 1378
9 7 1379
¿Debería recurrir a SQL Dinamico?
De momento lo único que tengo claro es que tengo que preguntar a los que
saben más que yo
Muchas gracias por su tiempo
 

Leer las respuestas

#1 Javier Loria
07/03/2004 - 13:59 | Informe spam
Hola Jose Antonio:
Yo no haria el Trigger, pero revisaria la Teoria de Arboles y Heraquias
de Joe Celko, que esta disenada presisamente con esta intencion. Para
manejar esto debes usar una Lista de Adyacencia que mantiene las relaciones.
No es teoria sencilla.
Como dices que no es demasiado profunda y no es demasiado grande puedes
probar manteniendo la estructura y escribiendo algo asi:
==-- Hijos
SELECT IdUnidad
FROM Unidades
WHERE IdPadre=@IdUnidadBuscada
UNION ALL
SELECT N.IdUnidad
FROM Unidades AS N
JOIN Unidades as H
ON N.IdPadre=H.IdUnidad
WHERE H.IdPadre=@IdUnidadBuscada
UNION ALL
SELECT B.IdUnidad
FROM Unidades AS B
JOIN Unidades AS N
ON B.IdPadre=N.IdUnidad
JOIN Unidades as H
ON N.IdPadre=H.IdUnidad
WHERE H.IdPadre=@IdUnidadBuscada
UNION ALL
SELECT BB.IdUnidad
FROM Unidades AS BB
JOIN Unidades AS B
ON BB.IdPadre=B.IdUnidad
JOIN Unidades AS N
ON B.IdPadre=N.IdUnidad
JOIN Unidades as H
ON N.IdPadre=H.IdUnidad
WHERE H.IdPadre=@IdUnidadBuscada
== Espero te sirva y que no tenga errores de sintaxis porque van sin
probar.


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
José Antonio escribio:
Buenos días a :
Tengo una tabla unidades con dos campos idUnidad(autonumerico) y
idPadre(Long). Más o menos así:
idUnidad idPadre
1 0
2 0
3 1
4 1
5 2
6 3
7 3
8 7
9 7
De tal forma que 1 es padre de 3 y de 4, 3 es padre de 6 y 7 y 7 es
padre de 8
|6
|3| |8
1| |7|9
|4
Aunque está tabla no va a ser en principio muy grande ni va a haber
relaciones de muchas generaciones (no más de 4) me gustaría tener un
SP que me devolviera todos los hijos de una unidad determinada. Con
la unidad 7 no hay problema porque solo tiene una generación de
hijos: Select idUnidad from unidades where idunidad =@idUnidad or
idPadre = @idUnidad.
Pero claro cuando quiero saber todos los descendientes de 3 la cosa
no me parece tan sencilla. ¿Hay alguna forma de hacerlo?.

Como esto no me salía tenía pensado llevarme el recordset con todas la
unidades hasta el cliente y allí tratarlo con alguna función
recursiva y que solo le permitiera ver los descendientes de la unida
a la que él pertenece. ¿Me pueden aconsejar alguna estrategia mejor?.
¿Debería añadir un tercer campo "LibroFamilia" (Varchar(50)) y
rellenarlo mediante un trigger idUnidad idPadre LibroFamilia
1 0
2 0
3 1 13
4 1 14
5 2 25
6 3 136
7 3 137
8 7 1378
9 7 1379
¿Debería recurrir a SQL Dinamico?
De momento lo único que tengo claro es que tengo que preguntar a los
que saben más que yo
Muchas gracias por su tiempo

Preguntas similares