Query con datos en arbol ..?

29/09/2003 - 17:48 por Cándido Zuriaga | Informe spam
Buenas, estaba intentando crear una query para unir varias tablas, donde un
campo cumple una determinada condición o es descendiente de alguno que la,
ya que la tabla tiene una relación sobre si misma.

La tabla A tiene:

A: (id, campo1, parent_id)

parent_id es una clave foránea a la misma tabla A (id)

La query habitual sería

SELECT * FROM A, B
WHERE A.id = B.fk_id_A AND A.campo1='loquesea'

Pero en vez de restringir los campos de A a los que cumplen la condicion
A.campo1='loquesea', también se tengan en cuenta aquellos descendiente
(hijos, hijos de hijos, etc) aunque no cumplan la condición.

Una aproximación para Oracle (sé que se puede hacer con CONNECT BY y otras
clausulas, pero son propias de Oracle y quería estandarizarlo un poco) ha
sido crear una funcion que se le pasa el 'loquesea' y me devuelve una cadena
con todos los IDs válidos separados por pipes, ej) '|23|34|78|93|105|229|'.
Es una función que se llama recursivamente y va formando el string de
salida.

Al final la query queda

SELECT * FROM A, B
WHERE A.id = B.fk_id_A AND
INSTR(Fuincion('loquesea'), '|' || to_char(A.campo1) || '|') > 0

O sea que la cadena |id| esté dentro de esa cadena que tiene todos los ids
concatenados.

Esto funciona, en Oracle. En SQL Server quería hacer algo parecido, pero no
deja hacer procedimientos / funciones recursivos. He consequido hacer un
procedure que introduce en una tabla temporal todos esos IDs, pero no puede
ser llamado desde una función (solo se pueden llamar funciones y
procedimientos extendidos, dice) para devolver la cadena de IDs y utilizarlo
en la query como he hecho arriba

¿Alguien sabe como tratar estos datos en árbol en SQL Server para ejecutar
la query que necesito?

Gracias
 

Leer las respuestas

#1 Eladio Rincón
29/09/2003 - 21:36 | Informe spam
Hola,

esta url te puede servir:
Expanding Hierarchies
http://msdn.microsoft.com/library/d...4_5yk3.asp

o en BOL
Expandir jerarquías
mk:@MSITStore:C:\Archivos%20de%20programa\Microsoft%20SQL%20Server\80\Tools\Books\acdata.chm::/ac_8_qd_14_5yk3.htm


Eladio Rincón
SQL Server MVP
http://eladio.europe.webmatrixhosting.net



"Comparte lo que sabes, aprende lo que no sepas." FGG

"Cándido Zuriaga" escribió en el mensaje news:bl9m6n$hgp$
Buenas, estaba intentando crear una query para unir varias tablas, donde un
campo cumple una determinada condición o es descendiente de alguno que la,
ya que la tabla tiene una relación sobre si misma.

La tabla A tiene:

A: (id, campo1, parent_id)

parent_id es una clave foránea a la misma tabla A (id)

La query habitual sería

SELECT * FROM A, B
WHERE A.id = B.fk_id_A AND A.campo1='loquesea'

Pero en vez de restringir los campos de A a los que cumplen la condicion
A.campo1='loquesea', también se tengan en cuenta aquellos descendiente
(hijos, hijos de hijos, etc) aunque no cumplan la condición.

Una aproximación para Oracle (sé que se puede hacer con CONNECT BY y otras
clausulas, pero son propias de Oracle y quería estandarizarlo un poco) ha
sido crear una funcion que se le pasa el 'loquesea' y me devuelve una cadena
con todos los IDs válidos separados por pipes, ej) '|23|34|78|93|105|229|'.
Es una función que se llama recursivamente y va formando el string de
salida.

Al final la query queda

SELECT * FROM A, B
WHERE A.id = B.fk_id_A AND
INSTR(Fuincion('loquesea'), '|' || to_char(A.campo1) || '|') > 0

O sea que la cadena |id| esté dentro de esa cadena que tiene todos los ids
concatenados.

Esto funciona, en Oracle. En SQL Server quería hacer algo parecido, pero no
deja hacer procedimientos / funciones recursivos. He consequido hacer un
procedure que introduce en una tabla temporal todos esos IDs, pero no puede
ser llamado desde una función (solo se pueden llamar funciones y
procedimientos extendidos, dice) para devolver la cadena de IDs y utilizarlo
en la query como he hecho arriba

¿Alguien sabe como tratar estos datos en árbol en SQL Server para ejecutar
la query que necesito?

Gracias


Preguntas similares