En otros artículos ya habíamos visto como usar recursividad en los stored procedures y en los SELECTs del Firebird, así que ahora es tiempo de mostrar algunos ejemplos para que se entienda mejor lo que podemos hacer.

Problema:

Queremos mostrar las filas de nuestra tabla CUENTAS de 3 en 3, o sea las filas 1, 4, 7, 10, etc.

EJEMPLO1-1

Captura 1. Si haces clic en la imagen la verás más grande

Solución:

Listado 1.

WITH RECURSIVE SALTEAR AS (
   SELECT
      1 AS NUMERO,
      T1.CUE_IDENTI,
      T1.CUE_NOMBRE,
      (SELECT FIRST 1 SKIP 2 T2.CUE_IDENTI FROM CUENTAS T2 WHERE T2.CUE_IDENTI > T1.CUE_IDENTI ORDER BY T2.CUE_IDENTI) AS SIGUIENTE
   FROM
      (SELECT FIRST 1 T1.CUE_IDENTI, T1.CUE_NOMBRE FROM CUENTAS T1 ORDER BY T1.CUE_IDENTI) T1

   UNION ALL

   SELECT
      NUMERO + 1,
      T1.CUE_IDENTI,
      T1.CUE_NOMBRE,
      (SELECT FIRST 1 SKIP 2 T2.CUE_IDENTI FROM CUENTAS T2 WHERE T2.CUE_IDENTI > T1.CUE_IDENTI ORDER BY T2.CUE_IDENTI) AS SIGUIENTE
   FROM
      SALTEAR T3
   JOIN
      CUENTAS T1 
         ON T1.CUE_IDENTI = T3.SIGUIENTE
   WHERE
      NUMERO < 1024

)

SELECT
   NUMERO,
   CUE_IDENTI,
   CUE_NOMBRE,
   SIGUIENTE
FROM
   SALTEAR

EJEMPLO1-2

Captura 2. Si haces clic en la imagen la verás más grande

Como puedes ver, las filas se muestran de 3 en 3

Explicación:

Creamos una tabla virtual recursiva llamada SALTEAR, cuya primera fila no es recursiva. Las filas recursivas son las que se van insertando en el SELECT que se encuentra después del UNION ALL.

Como nuestra tabla virtual es recursiva, entonces la podemos usar en el segundo SELECT. Usamos SKIP 2 para “saltar” dos lugares más, eso en la práctica significa que iremos de 3 en 3 (no te confundas, el SKIP es 2, pero el salto es de 3).

Desde luego que tu podrás saltar de 4 en 4, de 5 en 5, de 10 en 10, o de lo que quieras, saltar de 3 en 3 es solamente un ejemplo, para que se entienda el algoritmo.

¿Y por qué pusimos en el WHERE que NUMERO sea menor que 1024?

Porque el Firebird tiene un límite a la cantidad de llamadas recursivas que podemos realizar y ese límite es de 1024. O sea que hasta 1023 veces una tabla virtual recursiva puede llamarse a sí misma (la primera vez fue llamada desde afuera).

La columna NUMERO es muy útil para saber la cantidad de veces que se está ejecutando nuestra tabla virtual. Debes aprender esta técnica para aplicarla cuando no sepas de antemano la cantidad máxima de repeticiones que pueden ocurrir (desde luego que a tu columna puedes llamarla como quieras, llamarla NUMERO es solamente un ejemplo).

Como nuestra tabla SALTEAR es virtual (o sea que solamente existe en la memoria de la computadora pero no en el disco duro) entonces debemos usarla enseguida después de haberla creado. Eso fue justamente lo que hicimos en el último SELECT del Listado 1., es decir: usar la tabla virtual que habíamos creado.

Conclusión:

Si necesitamos ver a las filas de una tabla o de una vista de “x en x” entonces podemos crear una tabla virtual recursiva para obtener lo que estamos necesitando.

La técnica para numerar a las filas es muy útil para asegurarnos de nunca pasar la cantidad máxima de recursiones que permite el Firebird, esa cantidad es de 1024.

Artículos relacionados:

Stored procedures recursivos

Entendiendo a las tablas autoreferenciadas

Usando CTE (Common Table Expression)

Otro ejemplo de CTE: ventas semanales

Usando varias CTE en una vista o en un stored procedure

FOR SELECT y tablas CTE

Usando recursividad con CTE

El índice del blog Firebird21

El foro del blog Firebird21