Ver Mensaje Individual
  #12  
Antiguo 23-06-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Reputación: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Este SQL te devuelve una lista de números entre 1 y 100.
Código SQL [-]
with recursive n as (
      select 1 /*nro. inicial*/ as n
      from rdb$database
      union all
      select n.n + 1
      from n
      where n < 100 /*nro. final*/
     )
select n.n
from n;

Con esto como base restrinjo el rango al min/max id de la tabla articulos.
De este rango devuelvo solo los que no existen en la tabla de artículos.
Se parece a la respuesta de Neftali, pero para Firebird.
El único problema es que debido a la recursividad solo permite rangos de 1024 registros.

Código SQL [-]
WITH RECURSIVE N
AS (SELECT (SELECT MIN(ID)
            FROM ARTICULOS) AS N
    FROM RDB$DATABASE
    UNION ALL
    SELECT N.N + 1
    FROM N
    WHERE
    N < (SELECT MAX(ID)
         FROM ARTICULOS))
SELECT N.N
FROM N
WHERE
NOT EXISTS(SELECT ID
           FROM ARTICULOS
           WHERE
           ID = N.N)

Con respecto a la velocidad, lo he probado con una tabla con 800 registros indexados por el ID y no ha tardado nada.
Responder Con Cita