Un usuario del foro hizo esta pregunta: “Tengo una tabla llamada ETIQUETAS con dos columnas: NOMBRES Y NUMERO_REPETICIONES y deseo que cada nombre se repita esa cantidad de veces”.

La idea es imprimir etiquetas con esos nombres.

Solución:

Primero, creamos la tabla ETIQUETAS

ETIQUETAS1

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

Segundo, le insertamos algunas filas a la tabla de ETIQUETAS

ETIQUETAS2

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

Tercero, usando recursión obtenemos cada nombre, repetido la cantidad de veces indicada.

Listado 1.

WITH RECURSIVE MISETIQUETAS AS (
 
   SELECT
      ETI_NOMBRE,
      ETI_REPITE
   FROM
      ETIQUETAS
   WHERE
      ETI_REPITE > 0
 
   UNION ALL
 
   SELECT
      ETI_NOMBRE,
      ETI_REPITE - 1
   FROM
      MISETIQUETAS
   WHERE
      ETI_REPITE - 1 > 0
 
)

SELECT
   ETI_NOMBRE
FROM
   MISETIQUETAS

ETIQUETAS3

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

Y como podemos ver, cada nombre se ha repetido la cantidad de veces que habíamos escrito en la columna ETI_REPITE.

Explicación:

Primero, obtenemos todas las filas de la tabla ETIQUETAS cuya cantidad de etiquetas a imprimir es mayor que cero. Eso hace el primer SELECT, o sea nuestro “ancla” como habíamos visto en artículos anteriores.

Segundo, repetimos cada una de esas filas ETI_REPITE – 1 veces. ¿Por qué – 1? Porque la primera fila ya fue insertada por el “ancla” así que debemos insertar solamente las demás filas.

Tercero, mostramos cada nombre repetido la cantidad de veces que habíamos especificado en su columna ETI_REPITE. De eso se encarga el último SELECT.

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). Filas salteadas

Ejemplo de recursión (2). Numerar filas

Ejemplo de recursión (3). Fechas consecutivas

Ejemplo de recursión (4). Actualizando filas recursivamente

Ejemplo de recursión (5). Saldos acumulados

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios