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!

Preguntas similare

Leer las respuestas

#6 AlejoR
15/11/2005 - 21:13 | Informe spam
Si, tienes toda la razón, no le habia "dado la vuelta a la pagina". Y hay
encontré lo que necesitaba!


"Alejandro Mesa" escribió en el
mensaje news:
AlejoR,

En el link "Manipulating Hierarchies with UDFs", leete la parte sobre la
funcion ufn_GetMgmtChain.

declare @ConsecutivoTema int

set @ConsecutivoTema = 4

select *
from dbo.ufn_GetMgmtChain(@ConsecutivoTema ) as a


AMB

"AlejoR" wrote:

Funciona perfectamente. Gracias
Una adicional, si me encuentro en un nivel final, como podria obtener los
niveles hacia arriba en registros.


"Alejandro Mesa" escribió en el
mensaje news:
> AlejoR,
>
>> Entonces, si te entiendo, la idea es tener en un campo esa ruta
>> armada???
>> 1.1.1.1etc
>
> Correcto. Los links que adjunte te ayudaran a:
>
> 1 - Entender el metodo de "camino materializado".
> 2 - Como mantener este campo usando triggers
> 3 - Crear una funcion de usuario que te ayude a recorrer la jerarquia
>
>
> AMB
>
>
> AMB
>
> "AlejoR" wrote:
>
>> Creo que fue casualidad.
>> Lo puse como ejemplo para tratar de mostror la jerarquia que se
>> necesita,
>> pero en realidad en el nombre del tema solo esta el "Tema", la
>> jerarquia
>> la
>> mantengo con la relacion consecutivo_padre y consecutivo_tema
>>
>> Entonces, si te entiendo, la idea es tener en un campo esa ruta
>> armada???
>> 1.1.1.1etc
>>
>> "Alejandro Mesa" escribió en
>> el
>> mensaje news:
>> > 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
>> >
>> > especifico
>> > las
>> > normas
>> > 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!
>> >>
>> >>
>> >>
>>
>>
>>



Respuesta Responder a este mensaje
#7 Maxi
16/11/2005 - 13:16 | Informe spam
Hola, solo una acotacion, en SQL2005 existen las CTE's las cuales te haran
todo mucho mas facil y performante :-)


Salu2
Maxi [MVP SQL SERVER]


"AlejoR" escribió en el mensaje
news:
Si, tienes toda la razón, no le habia "dado la vuelta a la pagina". Y hay
encontré lo que necesitaba!


"Alejandro Mesa" escribió en el
mensaje news:
AlejoR,

En el link "Manipulating Hierarchies with UDFs", leete la parte sobre la
funcion ufn_GetMgmtChain.

declare @ConsecutivoTema int

set @ConsecutivoTema = 4

select *
from dbo.ufn_GetMgmtChain(@ConsecutivoTema ) as a


AMB

"AlejoR" wrote:

Funciona perfectamente. Gracias
Una adicional, si me encuentro en un nivel final, como podria obtener
los
niveles hacia arriba en registros.


"Alejandro Mesa" escribió en
el
mensaje news:
> AlejoR,
>
>> Entonces, si te entiendo, la idea es tener en un campo esa ruta
>> armada???
>> 1.1.1.1etc
>
> Correcto. Los links que adjunte te ayudaran a:
>
> 1 - Entender el metodo de "camino materializado".
> 2 - Como mantener este campo usando triggers
> 3 - Crear una funcion de usuario que te ayude a recorrer la jerarquia
>
>
> AMB
>
>
> AMB
>
> "AlejoR" wrote:
>
>> Creo que fue casualidad.
>> Lo puse como ejemplo para tratar de mostror la jerarquia que se
>> necesita,
>> pero en realidad en el nombre del tema solo esta el "Tema", la
>> jerarquia
>> la
>> mantengo con la relacion consecutivo_padre y consecutivo_tema
>>
>> Entonces, si te entiendo, la idea es tener en un campo esa ruta
>> armada???
>> 1.1.1.1etc
>>
>> "Alejandro Mesa" escribió
>> en el
>> mensaje news:
>> > 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
>> >
>> > especifico
>> > las
>> > normas
>> > 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!
>> >>
>> >>
>> >>
>>
>>
>>









email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida