Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

consulta de arbol

Estas en el tema de consulta de arbol en el foro de SQL Server en Foros del Web. hola quisiera que alguien me diera una idea de como hacer una consulta SQL. Lo que deseo hacer es realizar una consulta que me traiga ...
  #1 (permalink)  
Antiguo 12/10/2007, 11:38
 
Fecha de Ingreso: julio-2007
Mensajes: 9
Antigüedad: 17 años, 4 meses
Puntos: 0
consulta de arbol

hola quisiera que alguien me diera una idea de como hacer una consulta SQL.

Lo que deseo hacer es realizar una consulta que me traiga todos los proyectos de una compañia pero el problemas es que esos proyectos tienen sub-proyectos y a la vez esos sub-proyectos tienen otros sub-proyectos.

yo puedo llegar facilmente el segundo nivel de la consulta pero no puedo llegar al tercer o cuerto nivel de la consulta.

ejemple proyecto 001 este tinen dos sub_proyectos 001_0 y 001_2 a la vez 001_1 tiene dos sub-proyectos 001_1_1 y 001_1_2. no puedo hacer la consulta para plasmar el proyectos 001 con los sub_proyectos 001_1 y 001_2 y la vez el sub-sub-proyectos 001_1_1
  #2 (permalink)  
Antiguo 12/10/2007, 12:42
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Re: consulta de arbol

¿Que version de SQL SERVER tienes?

Debes estar conciente que hay un limite, cierto?
  #3 (permalink)  
Antiguo 12/10/2007, 21:39
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 18 años
Puntos: 6
Re: consulta de arbol

Yo haria un procedimiento almacenado.

Supongamos que tu tabla fuente tiene la siguiente estructura:

Tb_Proyectos(IdProyecto, Nombre, IdProyectoPadre)

donde IdProyecto es tu campo llave (unico obviamente) y la tabla tiene una referencia hacia sí misma mediante los campos IdProyecto ==> IdProyectoPadre.

Entonces haría un procedimiento almacenado de la siguiente forma...

Código:
Create Procedure SpObtenerArbolProyectos
(
    IdProyecto As Integer --El proyecto que necesitamos evaluar
)
As
    Declare @BanSiguente As Bit
    Declare @Profundidad As Integer

    Create Table #Tb_ProyectosTemp
    (
        IdProyecto Integer,
        Nombre VarChar(100),
        IdProyectoPadre Integer,
        Profundidad Integer
    )

    Set @Profundidad = 0

    /*Obtenemos el registro inicial*/
    Insert Into #Tb_ProyectosTemp(IdProyecto, Nombre, IdProyectoPadre, Profundidad)
        Select IdProyecto, Nombre, IdProyectoPadre, @Profundidad
        From Tb_Proyectos
        Where IdProyecto = @IdProyecto

    If @@RowCount > 0 Begin
        Set @BanSiguiente = 1
    Else
        Set @BanSiguiente = 0
    End If

    While @BanSiguiente = 1 Begin

        Set @Profundidad = @Profundidad + 1

        Insert Into #Tb_ProyectosTemp(IdProyecto, Nombre, IdProyectoPadre, Profundidad)
            Select IdProyecto, Nombre, IdProyectoPadre, @Profundidad
            From Tb_Proyectos P
            Where Exists( --Obtener los registros hijos de los registro que ya se tienen
                Select 1
                From #Tb_ProyectosTemp PP
                Where PP.IdProyecto = P.IdProyectoPadre
            )

        If @@RowCount > 0 Begin
            Set @BanSiguiente = 1
        Else
            Set @BanSiguiente = 0
        End If

    Loop

    --Devolver la estructura obtenida
    Select IdProyecto, Nombre, IdProyectoPadre, Profundidad
    From #Tb_ProyectosTemp

Go
Esta consulta te devolverá todos los registros hijos directos o indirectos del proyecto que le pases por parámetro, además te dará la profundidad del proyecto dentro del árbol que creaste....

Es muy importante que tengas perfectamente indexada la tabla de proyectos, ya que dependiendo de la cantidad de registros que almacenes en ella la consulta puede volverse muy lenta.

Espero te sirva...

Saludos!

Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....

Última edición por Gabo77; 12/10/2007 a las 21:44
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:11.