Query Recursivo

12/10/2008 - 06:39 por renemoreno | Informe spam
Hola a todos, a ver si alguien me puede ayudar con esto que ya me
tiene mareado.

Tengo dos campos con numero de codigo [DOCTO] y [DOCTOCOMP], un codigo
en DOCTO tiene un DOCTOCOMP, este codigo de DOCTOCOMP taambien existe
en el campo DOCTO y tambien tiene un DOCTOCOMP, esto se repite hasta
que DOCTO y DOCTOCOMP son iguales, ahi termina la secuencia. Por
ejemplo:

DOCTO - DOCTOCOMP
11111 - 22222
22222 - 33333
33333 - 44444
44444 - 44444

Estoy tratando de obtener el DOCTO incial y el DOCTOCOMP final, para
el ejemplo anterior seria 11111 - 44444.

Espero haber sido claro y de antemano agradezco cualquier ayuda que me
puedan dar.

Saludos
Rene Moreno

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua
12/10/2008 - 07:21 | Informe spam
"renemoreno" escribió en el mensaje
news:
Hola a todos, a ver si alguien me puede ayudar con esto que ya me
tiene mareado.

Tengo dos campos con numero de codigo [DOCTO] y [DOCTOCOMP], un codigo
en DOCTO tiene un DOCTOCOMP, este codigo de DOCTOCOMP taambien existe
en el campo DOCTO y tambien tiene un DOCTOCOMP, esto se repite hasta
que DOCTO y DOCTOCOMP son iguales, ahi termina la secuencia. Por
ejemplo:

DOCTO - DOCTOCOMP
11111 - 22222
22222 - 33333
33333 - 44444
44444 - 44444

Estoy tratando de obtener el DOCTO incial y el DOCTOCOMP final, para
el ejemplo anterior seria 11111 - 44444.

Espero haber sido claro y de antemano agradezco cualquier ayuda que me
puedan dar.

Saludos
Rene Moreno



Hola, Rene:

Seguramente habrá una manera mejor de hacerlo, pero esto funciona:

CREATE FUNCTION findDoctocomp(@p AS INT) RETURNS INT
AS
BEGIN
DECLARE @f AS INT
SET @f = (SELECT d2 FROM Test WHERE d1 = @p)
IF @f IS NULL RETURN @f
If @f = @p RETURN @f
RETURN dbo.findDoctocomp(@f)
END

Los nombres de las columnas están cambiados para no escribir tanto :)


Salud!
Respuesta Responder a este mensaje
#2 Alfredo Novoa
12/10/2008 - 13:10 | Informe spam
Hola,

El Sat, 11 Oct 2008 21:39:24 -0700 (PDT), renemoreno escribió:

Estoy tratando de obtener el DOCTO incial y el DOCTOCOMP final, para
el ejemplo anterior seria 11111 - 44444.

Espero haber sido claro y de antemano agradezco cualquier ayuda que me
puedan dar.



Es muy fácil. Solo tienes que usar una CTE (Common Table Expression).

Este tipo de consulta se llama "cierre transitivo". Si quieres ejemplos
puedes buscar: "transitive closure"+CTE


Saludos
Respuesta Responder a este mensaje
#3 Alfredo Novoa
12/10/2008 - 13:13 | Informe spam
Hola Leonardo,

El Sun, 12 Oct 2008 00:51:28 -0430, Leonardo Azpurua escribió:

Seguramente habrá una manera mejor de hacerlo, pero esto funciona:



Pues si, con una CTE tiene que ir mucho más rápido.


Saludos
Respuesta Responder a este mensaje
#4 Leonardo Azpurua
12/10/2008 - 17:14 | Informe spam
"Alfredo Novoa" escribió en el mensaje
news:

Hola Leonardo,

El Sun, 12 Oct 2008 00:51:28 -0430, Leonardo Azpurua escribió:

Seguramente habrá una manera mejor de hacerlo, pero esto funciona:



Pues si, con una CTE tiene que ir mucho más rápido.



Hola, Alfredo:

En los BOL del 2000 aparecen sólo dos instancias de "transitive closure",
ambas relacionadas con otra cosa, y ni un resultado para CTE. Busqué en
Google, pero me aburrí antes de encontrar nada util (aparece un articulo de
SQL Journal, o como quiera que se llame, pero es solo para suscriptores, lo
único que se puede acceder es el código, que es un poco coñazo).

Puedes sugerir algún vínculo que explique -como para que lo entienda un
desarrollador de aplicaciones de negocios- de que van las CTE?


Salud!
Respuesta Responder a este mensaje
#5 Pedro
12/10/2008 - 17:45 | Informe spam
Es a partir de la version del 2005.


"Leonardo Azpurua" <l e o n a r d o [arroba] m v p s [punto] o r g> escribió
en el mensaje news:

"Alfredo Novoa" escribió en el mensaje
news:

Hola Leonardo,

El Sun, 12 Oct 2008 00:51:28 -0430, Leonardo Azpurua escribió:

Seguramente habrá una manera mejor de hacerlo, pero esto funciona:



Pues si, con una CTE tiene que ir mucho más rápido.



Hola, Alfredo:

En los BOL del 2000 aparecen sólo dos instancias de "transitive closure",
ambas relacionadas con otra cosa, y ni un resultado para CTE. Busqué en
Google, pero me aburrí antes de encontrar nada util (aparece un articulo
de SQL Journal, o como quiera que se llame, pero es solo para
suscriptores, lo único que se puede acceder es el código, que es un poco
coñazo).

Puedes sugerir algún vínculo que explique -como para que lo entienda un
desarrollador de aplicaciones de negocios- de que van las CTE?


Salud!


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida