Ayuda en un query jerarquico...!

11/11/2005 - 15:13 por AlejoR | Informe spam
Que tal grupo, estoy un poco enrredado en un query asi que pido una
colaboración. ;)

Tengo en una tabla una estructura jerarquica de temas.
ConsecutivoTema, NombreTema, Padre, Ultimo
1 Tema 1 NULL N
2 Tema 1.1 1 N
3 Tema 1.1.1 2 S
4 Tema 1.1.2 2 S
5 Tema 1.1.3 2 S
6 Tema 1.2 1 N
7 Tema 1.2.1 6 S
8 Tema 2 NULL N
9 Tema 2.1 8 N
10 Tema 2.1.1 9 S

Table de Normas
ConsecutivoNorma, NombreNorma
1 Norma X
2 Norma Y
3 Norma A
4 Norma B
7 Norma F
10 Norma J
33 Norma FFX

Y una tabla que cruza las normas con los temas Normas X Temas (asociadas al
tema que sea ultimo nivel)
ConsecutivoNorma, ConsecutivoTema
1 3
1 7
2 4
3 5
7 3
7 7
10 10
33 10

Tengo en otra tabla unas Normas (leyes) y estan asociadas a un tema, pero a
un tema del ultimo nivel (S). es decir a los consecutivos 3,4,5,7 y 10 de la
tabla de temas en el ejemplo.

Si estoy localizado en el ultimo nivel de la jerarquia es "facil" sacar las
normas que estan asociadas a ese nivel. Pero si me posiciono en un nivel mas
arriba, como obtengo las normas asociadas a sus hijos.

Ejm.
Si me posiciono en el nivel Tema 1.1.1 que es ultimo nivel (3), me trae las
normas "Norma X (1)" y la "Norma F (7)"
Si me posiciono en el nivel Tema 1 deberia traerme todas las normas de sus
hijo (nietos en este caso) "Norma X (1), Norma Y(2), Norma F(7), Norma A (3)
Si me posiciono en el nivel Tema 2.1 deberia traerme todas las normas de sus
hijos. "Norma J (10) y Norma FFX (33)

Gracias por las sugerencias!
Suerte!
 

Leer las respuestas

#1 Alejandro Mesa
11/11/2005 - 16:12 | Informe spam
AlejoR,

No se si fue por casualidad o fue premeditado, pero la clave la tienes en el
nombre del tema. La forma que usas para formar el nombre del tema (sin
incluir la palabra "Tema"), se conoce como camino materializado. Aca te paso
unos links para que leas como trabajar con este metodo de representacion de
jerarquias y tambien una posible solucion a tu problema.

Si te fijas bien, puedes seleccionar los hijos y el resto de la generacion
si usas el operador LIKE y el caracter '%' y chequeas que el consecutivo del
tema esta en la tabla NormasXTemas.

declare @ConsecutivoTema int

set @ConsecutivoTema = 1

select b.ConsecutivoTema
from Temas as a inner join Temas as b
on b.NombreTema like a.NombreTema + '%'
where a.ConsecutivoTema = @ConsecutivoTema
and exists(select * from NormasXTemas as c where c.ConsecutivoTema =
b.ConsecutivoTema)

select n.NombreNorma
from
(
select b.ConsecutivoTema
from Temas as a inner join Temas as b
on b.NombreTema like a.NombreTema + '%'
where a.ConsecutivoTema = @ConsecutivoTema
and exists(select * from NormasXTemas as c where c.ConsecutivoTema =
b.ConsecutivoTema)
) as t
inner join
NormasXTemas as nt
on t.ConsecutivoTema = nt.ConsecutivoTema
inner join
Normas as n
on nt.ConsecutivoNorma = n.ConsecutivoNorma
go

Trees in SQL: Nested Sets and Materialized Path
http://www.dbazine.com/oracle/or-ar...tropashko4

Maintaining Hierarchies
http://www.windowsitpro.com/Article...?ArticleIDˆ26

Manipulating Hierarchies with UDFs
http://www.windowsitpro.com/SQLServ....html?Ad=1


AMB

"AlejoR" wrote:

Que tal grupo, estoy un poco enrredado en un query asi que pido una
colaboración. ;)

Tengo en una tabla una estructura jerarquica de temas.
ConsecutivoTema, NombreTema, Padre, Ultimo
1 Tema 1 NULL N
2 Tema 1.1 1 N
3 Tema 1.1.1 2 S
4 Tema 1.1.2 2 S
5 Tema 1.1.3 2 S
6 Tema 1.2 1 N
7 Tema 1.2.1 6 S
8 Tema 2 NULL N
9 Tema 2.1 8 N
10 Tema 2.1.1 9 S

Table de Normas
ConsecutivoNorma, NombreNorma
1 Norma X
2 Norma Y
3 Norma A
4 Norma B
7 Norma F
10 Norma J
33 Norma FFX

Y una tabla que cruza las normas con los temas Normas X Temas (asociadas al
tema que sea ultimo nivel)
ConsecutivoNorma, ConsecutivoTema
1 3
1 7
2 4
3 5
7 3
7 7
10 10
33 10

Tengo en otra tabla unas Normas (leyes) y estan asociadas a un tema, pero a
un tema del ultimo nivel (S). es decir a los consecutivos 3,4,5,7 y 10 de la
tabla de temas en el ejemplo.

Si estoy localizado en el ultimo nivel de la jerarquia es "facil" sacar las
normas que estan asociadas a ese nivel. Pero si me posiciono en un nivel mas
arriba, como obtengo las normas asociadas a sus hijos.

Ejm.
Si me posiciono en el nivel Tema 1.1.1 que es ultimo nivel (3), me trae las
normas "Norma X (1)" y la "Norma F (7)"
Si me posiciono en el nivel Tema 1 deberia traerme todas las normas de sus
hijo (nietos en este caso) "Norma X (1), Norma Y(2), Norma F(7), Norma A (3)
Si me posiciono en el nivel Tema 2.1 deberia traerme todas las normas de sus
hijos. "Norma J (10) y Norma FFX (33)

Gracias por las sugerencias!
Suerte!



Preguntas similares