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!