Hay varios métodos para conocer si una serie de números está en secuencia. Es decir si están como 1, 2, 3, 4, 5, 6, 7, 8, etc. o si falta algún número.

Uno de esos métodos es mediante el uso de una tabla autoreferenciada, como en el siguiente ejemplo:

SELECT
   P1.PRD_IDENTI
FROM
   PRODUCTOS P1
LEFT JOIN
   PRODUCTOS P2
      ON P1.PRD_IDENTI = P2.PRD_IDENTI - 1
WHERE
   P2.PRD_IDENTI IS NULL

Como puedes ver, la tabla PRODUCTOS le hace un LEFT JOIN a la tabla … PRODUCTOS. Por eso se dice que la tabla se referencia a sí misma.

Entonces, para saber si los valores de la columna PRD_IDENTI son consecutivos o no, la referencia se hace al valor de PRD_IDENTI menos uno.

Si hay números faltantes entonces la condición no se cumplirá. ¿Y cómo podemos saber que la condición no se cumplió? porque en ese caso el valor de PRD_IDENTI de la tabla relacionada será NULL.

Si nuestra tabla de PRODUCTOS tiene estos datos:

AUTOREF1

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

Entonces el SELECT anterior nos mostrará esto:

AUTOREF2

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

 ¿Qué significa? Que después del 25 no está el 26; ni después del 35 está el 36. ¿Y por qué aparece el 38? Porque es el valor que tiene PRD_IDENTI en la última fila y evidentemente como está en la última fila no habrá un valor mayor que él. Entonces siempre el valor que se encuentra en la última fila aparecerá, ese es un pequeño detalle a tener en cuenta.

Desventajas de este método

Este método funcionará siempre pero tiene una gran desventaja: está usando un LEFT JOIN y eso hará que la cantidad de filas leídas sea muy grande (no olvides que un JOIN es la multiplicación de las filas de la tabla de la izquierda por las filas de la tabla de la derecha). En tablas grandes este método puede ser increíblemente lento, pero para tablas pequeñas puede ser útil.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

 

Anuncios