domingo, 24 de mayo de 2020

CTE Common table expression RECURSIVE (Fibonacci, Factorial)



EJEMPLO 1

WITH CTE
AS
(
 SELECT i = 1

 UNION ALL

 SELECT       i + 1
 FROM        CTE
 WHERE       i <= 10


)
SELECT *
FROM CTE





















OTRO EJEMPLO DE RECURSIVIDAD



DECLARE @Cadena     VARCHAR (30);
SET @Cadena ='GPXDCWUJREMKIALVOTFNYBZSHQ';

WITH BURBUJA
AS
  (
   SELECT Id = 1

   UNION ALL -- EL CÓDIGO DE ARRIBA SE EJECUTA UNA SOLA VEZ, MIENTRAS QUE ABAJO ES RECURSIVO

   SELECT    Id + 1
   FROM             BURBUJA
   WHERE     Id < LEN (@Cadena)
  )
   SELECT    Id
                    , Letra = SUBSTRING (@Cadena, Id, 1)
   FROM             BURBUJA

   ORDER BY  Letra



































EJEMPLO 3

WITH CTE
AS
  (

   SELECT Id = 1

   UNION ALL -- EL CÓDIGO DE ARRIBA SE EJECUTA UNA SOLA VEZ, MIENTRAS QUE ABAJO ES RECURSIVO

   SELECT    Id  + 1
   FROM             CTE
   WHERE     Id < 17
  )
   -- AQUI ESTÁ EL TRUCO PARA METER ESPACIOS EN UN TIPO DE DATO NUMÉRICO (arriba)
   SELECT    Id = REPLICATE(' ', Id) +  CONVERT (VARCHAR(20), Id)
                   
   FROM             CTE

   ORDER BY CONVERT(TINYINT,LTRIM(ID))



























FACTORIAL

DECLARE @Factorial  TINYINT = 5;

WITH Factorial
AS
(
       SELECT   Id = 1
                    ,Resultado = 1

       UNION ALL

       SELECT Id + 1
                    ,Resultado = Resultado * (Id + 1)
       FROM   Factorial
       WHERE  Id < @Factorial
)

 SELECT             *

 FROM        Factorial




















FIBONACCI





















DECLARE @Fibonacci  TINYINT = 10;

WITH FibonacciCalculation
AS
(
      
       SELECT  
                     Id                 = 2
                    ,F                  = 1         
                    ,Contador    = 1         
      

       UNION ALL

       SELECT Id                 = Id + 1
                    ,F                  =  Contador
                    ,Resultado    =  F + Contador

       FROM   FibonacciCalculation
       WHERE  Id < @Fibonacci
)
 SELECT             Id = 1, Fibonacci = 1   -- para evitar evaluar todos los numeros 
                    UNION ALL
 SELECT            
                    Id
                    ,Fibonacci = F
 FROM        FibonacciCalculation

 OPTION (MAXRECURSION 0);


















No hay comentarios.:

Publicar un comentario