Aquí tenemos otro ejemplo de una tabla virtual recursiva. Este ejemplo es muy, muy sencillo, pero ilustra una técnica que podemos usar para numerar filas.

Listado 1.

WITH RECURSIVE CONSECUTIVOS AS (
   
   SELECT 
      1 AS CONTADOR 
   FROM 
      RDB$DATABASE
   
   UNION ALL
   
   SELECT 
      CONTADOR + 1 
   FROM 
      CONSECUTIVOS 
   WHERE 
      CONTADOR < 10

)

SELECT
   *
FROM
   CONSECUTIVOS

EJEMPLO2-1

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

Como siempre, la primera fila no es recursiva, las filas recursivas son las que se encuentran a continuación de UNION ALL (recuerda que una tabla virtual recursiva es una UNION entre una o más filas no recursivas y una o más filas recursivas).

Según el valor que le asignemos a la columna CONTADOR (ese nombre es sólo un ejemplo, tú puedes llamarlo como quieras) podemos numerar de 1 en 1 (como hicimos en el Listado 1.) o numerar de 2 en 2, de 3 en 3, o como se nos ocurra.

Numerando las filas de un SELECT

Para que se entienda mejor la utilidad de este algoritmo ahora numeraremos las filas de un SELECT. Tenemos una tabla llamada FACTURAS que tiene estos datos:

NUMERAR1

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

Y lo que deseamos es numerar a sus filas, ¿cómo lo podemos hacer?

Listado 2.

WITH RECURSIVE CONSECUTIVOS AS (

   SELECT 
      1 AS CONTADOR,
      FAC_NUMERO
   FROM 
      FACTURAS
   WHERE
      FAC_NUMERO = '001-001-0001234'

   UNION ALL

   SELECT 
      FIRST 1
      CONTADOR + 1,
      FAC_NUMERO
   FROM 
      FACTURAS     F
   JOIN 
      CONSECUTIVOS C
         ON F.FAC_NUMERO > C.FAC_NUMERO
   WHERE 
      CONTADOR < 1024

)

SELECT
   C.CONTADOR,
   F.FAC_NUMERO,
   F.FAC_FECVEN,
   F.FAC_MONTOX
FROM
   FACTURAS     F
JOIN
   CONSECUTIVOS C
      ON C.FAC_NUMERO = F.FAC_NUMERO

NUMERAR2

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

Y como puedes ver, ahora tenemos ¡¡¡a todas las filas numeradas!!!

Puede ser muy útil a veces, pero debes recordar algo importante: este algoritmo solamente funcionará si la cantidad de filas es como máximo 1024 porque ese es el límite de llamadas recursivas del Firebird, no permite más que 1024.

Como en todos los casos, nuestra tabla virtual recursiva empieza con una fila no recursiva, a la cual conocemos y desde la cual vamos a partir. Esa es nuestra fila “ancla”. Las demás filas (o sea, las filas recursivas) se van agregando a la tabla virtual mientras nuestra tabla de FACTURAS tenga filas y la cantidad de esas filas sea menor que 1024.

Si las filas de la tabla FACTURAS son más que 1024, para evitar que sobrepasen ese límite de 1024 se podría filtrar con la cláusula WHERE.

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

Ejemplo de recursión (1)

Numerando las filas de un SELECT

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios