9 de marzo de 2011

SQL (TSQL) Consulta Recursiva Simple

Este es un post rápido con el único objetivo de escribir un ejemplo simple de Recursividad en T-SQL.

imageImaginemos que tenemos una tabla de Clientes (similar a la de la figura) en la que además de otros datos disponemos del IdCliente y el IdPadrino.

Si quisiéramos obtener todos los descendientes de un cliente concreto (hijos, nietos, bisnietos, etc.) hasta un subnivel de profundidad determinado.

Para conseguirlo podríamos usar una consulta recursiva en TSQL que nos devolviera dichos datos.

La Consulta Recursiva SQL seria la siguiente:

WITH RecursivaSimple(IdCliente, IdPadrino, SubNivel)
AS
(    
  SELECT IdCliente, IdPadrino, 1 FROM Clientes  WHERE IdPadrino = 18
  UNION ALL
  SELECT C.IdCliente, C.IdPadrino, SubNivel + 1
  FROM Clientes C
    INNER JOIN RecursivaSimple R ON R.IdCliente = C.IdPadrino
)
SELECT RS.IdCliente, RS.IdPadrino, RS.SubNivel
FROM RecursivaSimple RS
WHERE SubNivel <= 5

En esta consulta recuperaremos todos los descendientes del cliente 18, en otras palabras, comenzaremos por los clientes que tienen como padrino al cliente numero 18. Además estaremos descendiendo hasta el subnivel 5 como máximo.

1 comentario:

  1. Hola Derbis, me ha venido genial tu aportación y he podido resolver mi problema que era obtener todo el arbol completo a partir de un elemento.

    Pongo aquí mi solución por si a alguien le sirve.

    WITH RecursivaSimplePadres(IdSeguimientoComercial, IdSeguimientoComercialAnterior)
    AS
    (
    SELECT IdSeguimientoComercial,IdSeguimientoComercialAnterior FROM CANDIDATOSSEGUIMIENTOCOMERCIAL WHERE IdSeguimientoComercial = 2
    UNION ALL
    SELECT C.IdSeguimientoComercial, C.IdSeguimientoComercialAnterior
    FROM CANDIDATOSSEGUIMIENTOCOMERCIAL C
    INNER JOIN RecursivaSimplePadres R ON R.IdSeguimientoComercialAnterior= C.IdSeguimientoComercial
    ),
    RecursivaSimpleHijos(IdSeguimientoComercial, IdSeguimientoComercialAnterior)
    AS
    (
    SELECT IdSeguimientoComercial, IdSeguimientoComercialAnterior FROM CANDIDATOSSEGUIMIENTOCOMERCIAL WHERE IdSeguimientoComercial = 2
    UNION ALL
    SELECT C.IdSeguimientoComercial, C.IdSeguimientoComercialAnterior
    FROM CANDIDATOSSEGUIMIENTOCOMERCIAL C
    INNER JOIN RecursivaSimpleHijos R ON R.IdSeguimientoComercial = C.IdSeguimientoComercialAnterior
    )

    SELECT RSP.IdSeguimientoComercial, RSP.IdSeguimientoComercialAnterior
    FROM RecursivaSimplePadres RSP


    UNION

    SELECT RSH.IdSeguimientoComercial, RSH.IdSeguimientoComercialAnterior
    FROM RecursivaSimpleHijos RSH

    ResponderEliminar