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

#11 Leonardo Azpurua
13/10/2008 - 02:41 | Informe spam
"Alfredo Novoa" escribió en el mensaje
news:1mangyg5zk7oo$.1ov3yic7tqiox$
El Sun, 12 Oct 2008 17:34:11 -0430, Leonardo Azpurua escribió:

Yo igual me quedé sin entender nada :)



Es muy fácil.



Pues sí.

A la carpeta de las explicaciones que vale la pena guardar.

Muchisimas gracias, Alfredo.

Salud!
Respuesta Responder a este mensaje
#12 Alejandro Mesa
14/10/2008 - 02:01 | Informe spam
renemoreno,

Aqui tienes otra version, pero el principio sigue siendo el mismo, una CTE
recursiva.

; WITH r_cte
AS
(
SELECT
docto, doctocomp, 1 AS lvl
FROM
dbo.t
WHERE
docto = doctocomp

UNION ALL

SELECT
c.docto, c.doctocomp, p.lvl + 1 AS lvl
FROM
dbo.t AS c
INNER JOIN
r_cte AS p
ON p.docto = c.doctocomp
AND (c.docto <> c.doctocomp)
),
r_set
AS
(
SELECT *, ROW_NUMBER() OVER(ORDER BY lvl DESC) AS rn
FROM r_cte
)
SELECT
MAX(CASE WHEN rn = 1 THEN docto END) AS c1,
MAX(CASE WHEN lvl = 1 THEN doctocomp END) AS c2
FROM
r_set
GO


AMB


"renemoreno" wrote:

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

Respuesta Responder a este mensaje
#13 Alfredo Novoa
14/10/2008 - 14:21 | Informe spam
Hola Alejandro,

El Mon, 13 Oct 2008 17:01:00 -0700, Alejandro Mesa escribió:

Aqui tienes otra version, pero el principio sigue siendo el mismo, una CTE
recursiva.



Lo malo de usar MAX es que si en la tabla hay varias jerarquías solo sacas
el principio y final de una de ellas.


Saludos
Alfredo
Respuesta Responder a este mensaje
#14 Alejandro Mesa
14/10/2008 - 15:11 | Informe spam
Alfredo,

Asi es, y en cuyo caso podriamos usar:

; WITH r_cte
AS
(
SELECT
docto, doctocomp, docto AS grp, 1 AS lvl
FROM
dbo.t
WHERE
docto = doctocomp

UNION ALL

SELECT
c.docto, c.doctocomp, p.grp, p.lvl + 1 AS lvl
FROM
dbo.t AS c
INNER JOIN
r_cte AS p
ON p.docto = c.doctocomp
AND (c.docto <> c.doctocomp)
),
r_set
AS
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY grp ORDER BY lvl DESC) AS rn
FROM r_cte
)
SELECT
MAX(CASE WHEN rn = 1 THEN docto END) AS c1,
MAX(CASE WHEN lvl = 1 THEN doctocomp END) AS c2
FROM
r_set
GROUP BY
grp
GO


AMB





"Alfredo Novoa" wrote:


Hola Alejandro,

El Mon, 13 Oct 2008 17:01:00 -0700, Alejandro Mesa escribió:

> Aqui tienes otra version, pero el principio sigue siendo el mismo, una CTE
> recursiva.

Lo malo de usar MAX es que si en la tabla hay varias jerarquías solo sacas
el principio y final de una de ellas.


Saludos
Alfredo

Respuesta Responder a este mensaje
#15 Alfredo Novoa
14/10/2008 - 15:52 | Informe spam
Hola Alejandro,

El Tue, 14 Oct 2008 06:11:01 -0700, Alejandro Mesa escribió:

Asi es, y en cuyo caso podriamos usar:

; WITH r_cte
AS ...



Debe de haber algo mal por que acabo de probar y me sigue sacando solo
una
fila.

Los datos con los que he probado son estos:

00000 00000
11111 22222
22222 33333
33333 44444
44444 55555
77777 88888
88888 99999
99999 00000

Tendría que devolver esto:

11111 55555
77777 00000

Y me devuelve

77777 00000


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