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

Preguntas similare

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


Respuesta Responder a este mensaje
#2 Cándido Zuriaga
01/10/2003 - 11:52 | Informe spam

"Eladio Rincón" escribió en el mensaje

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


Gracias, pero más que el recorrer una tabla y sacar los datos tabulados (que
es lo que he encontrado por todos los sitios) necesito emular esta query de
Oracle:

SELECT distinct D.name
FROM prod_categ A,
products B,
prod_comp C,
companies D
WHERE A.id_products = B.id_products AND
B.id_products = C.id_products AND
C.id_companies = D.id_companies AND
B.name like '%ProductSubstr%' AND
A.id_categories in
(SELECT id_categories
FROM categories
START WITH id_categories in
(SELECT id_categories FROM categories WHERE name like
'%CategSubstr%')
CONNECT BY PRIOR id_categories = id_categories_parent);

O sea: "Listado de nombres de compañías que sirvan productos en cuyo nombre
se contenga la subcadena ProductSubstr y que pertenezcan a una categoría
cuyo nombre contenga la subcadena CategSubstr o a cualquiera de las
categorías descendientes aunque no cumplan esa condición

¿Alguna idea?
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida