Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

¿Es posible esta consulta?

Estas en el tema de ¿Es posible esta consulta? en el foro de SQL Server en Foros del Web. Hola a todos, necesito un poco de ayuda con un querry que estoy tratando de hacer que ahorita me tiene hasta con migraña por que ...
  #1 (permalink)  
Antiguo 12/09/2012, 20:47
Avatar de focesar  
Fecha de Ingreso: abril-2005
Mensajes: 84
Antigüedad: 19 años, 6 meses
Puntos: 0
Pregunta ¿Es posible esta consulta?

Hola a todos, necesito un poco de ayuda con un querry que estoy tratando de hacer que ahorita me tiene hasta con migraña por que no le llego.

Tengo una tabla. llamada clientes, que tiene un campo int que se llama TID, por lo general el rango de numeros a almacenar en este campo va ha ir de 1 a 5000,

Ahora bien, ahorita, cuando hago insert de un TID utilizo un esta sentencia
Código SQL:
Ver original
  1. SELECT MAX(TID)+1 AS TID FROM clientes

El problema es que si un usuario de la aplicacion elimino un TID, muy bajo como el 10, ese TID no se va ha usar de nuevo por la funcion que estoy usando busca el valor maximo de la columna, le suma 1 y lo incluye.

Hay alguna forma de hacer una consulta que me busque de 1 a 5000 los numeros que no esten presentes en el campo TID de la tabla clientes y me de el primero valido para usarlo en el insert?.

Gracias a todos por la ayuda que me puedan dar por ya no me da...
__________________
El valor el hombre no es proporcional a las veces que ha triunfado, sino a las veces que se a levantado de los errores

:pensando:

Última edición por focesar; 12/09/2012 a las 20:58 Razón: seguimiento, redaccion
  #2 (permalink)  
Antiguo 13/09/2012, 08:30
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: ¿Es posible esta consulta?

si se puede pero con un simple query no lo vas a lograr deberias de sacar cuales son los huecos en tu tabla digamos metes en una tabla los valores del 1-5000 y luego comparas tus datos contra los valores que tengas en tu tabla de ids :), donde tengas huecos quiere decir que hay un faltante......

algo asi:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT
  4. )
  5.  
  6. INSERT INTO #temp VALUES (1)
  7. INSERT INTO #temp VALUES (2)
  8. INSERT INTO #temp VALUES (3)
  9. INSERT INTO #temp VALUES (4)
  10. INSERT INTO #temp VALUES (6)
  11. INSERT INTO #temp VALUES (7)
  12. INSERT INTO #temp VALUES (8)
  13. INSERT INTO #temp VALUES (9)
  14. INSERT INTO #temp VALUES (11)
  15. INSERT INTO #temp VALUES (15)
  16.  
  17. DECLARE @total INT
  18. DECLARE @x INT
  19. DECLARE @id INT
  20. SELECT @total=MAX(id) FROM #temp
  21. SET @x=1
  22. while @x<=@total
  23. BEGIN
  24.     SET @id=0
  25.     SELECT @id=id FROM #temp WHERE id=@x
  26.     IF @id=0
  27.         BEGIN
  28.             print 'Numero faltante ' + CONVERT(VARCHAR(20),@x)
  29.             SET @x=@total      
  30.         END
  31.     ELSE
  32.       BEGIN
  33.         SET @x=@x+1
  34.       END
  35. END
esto te regresara cual es el id faltante en la serie :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 13/09/2012, 14:01
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 12 años, 4 meses
Puntos: 40
Respuesta: ¿Es posible esta consulta?

Te adjunto dos opciones distintos como recuperar los valores perdidos de la tabla que Libras proporciono:
Código SQL:
Ver original
  1. SELECT  id+1
  2. FROM    #temp T1
  3. WHERE   NOT EXISTS (SELECT  1
  4.                     FROM    #temp T2
  5.                     WHERE   T2.id=T1.id+1);
  6.  
  7. SELECT  T1.id+1
  8. FROM    #temp T1
  9. LEFT JOIN #temp T2
  10.         ON T1.id+1=T2.id
  11. WHERE   T2.id IS NULL;
El rendimiento en ambas opciones es mas o menos lo mismo,
pero espero que en la verdadera tabla hay Index en la columna ID.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog
  #4 (permalink)  
Antiguo 18/09/2012, 11:57
Avatar de focesar  
Fecha de Ingreso: abril-2005
Mensajes: 84
Antigüedad: 19 años, 6 meses
Puntos: 0
Respuesta: ¿Es posible esta consulta?

Gracias a Libras y GeriReshef.

Lo hice asi,

Genere una tabla que se llama Listados con un solo campo Listado que es donde tengo el consecutivo de numeros
Y por medio de este SQL verifico que no esten los TID ocupados.

Código SQL:
Ver original
  1. SELECT  Listado
  2. FROM    dbo.Listados
  3. WHERE   NOT EXISTS (SELECT  TID_Cliente
  4.                     FROM    Clientes
  5.                     WHERE   Clientes.TID_Cliente=Listado );

Y listo.. me funciona. Gracias.
__________________
El valor el hombre no es proporcional a las veces que ha triunfado, sino a las veces que se a levantado de los errores

:pensando:

Etiquetas: insert, posible, select, tabla, campos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:47.