Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-06-2022
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Dependiendo del motor puede hacerse. En PostgreSQL tienen una función que genera datos al vuelo:

Código SQL [-]
SELECT generate_series AS id FROM generate_series(1, 5)
NOT IN (
   SELECT id FROM tu_tabla 
)
__________________
El malabarista.
Responder Con Cita
  #2  
Antiguo 22-06-2022
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.682
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Cita:
Empezado por mamcx Ver Mensaje
Dependiendo del motor puede hacerse. En PostgreSQL tienen una función que genera datos al vuelo:
Creo que no es eso lo que pregunta, ya que la generación automática "aleatoria" está disponible en casi todas las herramientas de manejo de bases de datos.
Responder Con Cita
  #3  
Antiguo 22-06-2022
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Creo que no es eso lo que pregunta, ya que la generación automática "aleatoria" está disponible en casi todas las herramientas de manejo de bases de datos.
Eso no es la función que mostré.

Esta genera datos basados en un rango (no aleatorio) y devuelve una tabla como si se hubiera llenado manualmente.

https://www.citusdata.com/blog/2018/...-generate-sql/
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 23-06-2022
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.682
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Pues eso, que no es lo que está buscando
Responder Con Cita
  #5  
Antiguo 23-06-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.449
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Yo creo que podrías sacerlo con algo así; Creo que todo lo que he utilizado existe en todos los motores de SQL (es estandard de SQL).
Tal vez cambie cómo se definen las variables, pero la sintaxis debe ser similar.
Suponiendo que la tabla se llame TABLA1 y tenga estos valores:

Cita:
ID NOMBRE
--------------
0 Articulo 0
2 Articulo 2
4 Articulo 4
5 Articulo 5
7 Articulo 7
Una consulta como esta, debería devolver los valores que no existen en esa tabla en el campo ID.

Para ello se crea una temporal con todos los posibles, entre el maximo y mínimo existente en TABLA1, y luego se miran los que faltan.

Código SQL [-]
-- Definimos la tabla con TODOS los valores posibles
DECLARE @tablatmp table (NUMEROS INT);
-- Variables de máximo y mínimo de la TABLA1
declare @max int;
declare @min int;
--Valor máximo de la tabla
set @max = (SELECT MAX(ID) NUMMAX From TABLA1)
--Valor mínimo de la tabla
set @min = (SELECT MIN(ID) NUMMIN From TABLA1)
-- llenar la tabla con los valores desde el mínima al máximo 
declare @i int
set @i=@min
while (@i <= @max) begin
  set @i = @i + 1
  insert into @tablatmp (NUMEROS) VALUES (@i)
end
-- Devolver los valores uqe faltan en el campo ID de la TABLA1
SELECT NUMEROS from @tablatmp WHERE NUMEROS NOT IN (SELECT ID FROM Tabla1)

En la imagen, lo primero es TABLA1 y lo segundo la consulta anterior ejecutada:
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 23-06-2022 a las 09:43:48.
Responder Con Cita
  #6  
Antiguo 23-06-2022
glopez glopez is offline
Miembro
 
Registrado: ago 2003
Ubicación: Huelva
Posts: 84
Poder: 24
glopez Va por buen camino
Hola, ante todo muchas gracias a todos por vuestras respuestas.
Quizás no me explique bien.
Lo que necesito es ver que saltos hay en la numeración en un campo de una tabla (número factura). Lo necesito para ver si existen saltos en la numeración que le asigna un usuario a las facturas recibidas y/o emitidas en un programa contable.
He probado la solución de duilioisola porque la veía más simple pero la ejecución de la consulta es muy lenta unos 20s en unos 2000 registros y falla cuando hay dos saltos consecutivos (1,2,5,6,7...).

La solución de Neftali no la he probado pero la veo un poco complicada y creo que no obtendré más rapidez en los resultados, porque hay que ir insertando valores en una tabla. Tengo clientes con millones de registros.

¿Alguna otra solución?
Responder Con Cita
  #7  
Antiguo 23-06-2022
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.682
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Entonces, tienes una tabla con un campo numérico.
Código:
1
2
4
5
6
8
9
Y quieres sabe qué números faltan, ¿es eso?
Responder Con Cita
  #8  
Antiguo 23-06-2022
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mostrar barras en Tchart sin huecos cocute Varios 1 26-01-2015 14:45:36
Problema con Stored Procedure para actualizar tabla con datos de otra tabla. Adrian Murua MySQL 4 04-02-2012 02:54:49
Huecos en una tabla digongo SQL 5 20-12-2007 19:03:14
Recorrer Tabla, contar registro repetidos y escribir totales en otra Tabla Lucas_diaz1810 Conexión con bases de datos 1 25-12-2006 13:04:34
Tabla con huecos NickName Firebird e Interbase 5 23-09-2003 19:42:09


La franja horaria es GMT +2. Ahora son las 06:30:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi