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