Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/05/2015, 09:22
Kritik
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
Respuesta: consulta muy larga.

Me he creado una base de datos más pequeñita, para probar con ella.

Estos son mis datos:
Código:
Numero	Codigo	multiplo1	multiplo2	multiplo3
1	A         2		NULL		4
2	B         NULL		6		NULL
7	A         14		21		NULL
21	B         42		NULL		84
42	NULL	  NULL		NULL		NULL
84	NULL	  NULL		NULL		NULL
(El único que no admite NULL es Numero)

El resultado que quiero obtener son los números 4 (1º registro multiplo3), 6 (2º registro multiplo2) y 14 (3º registro multiplo1). El resto de números de las columnas multiplo1, multiplo2 y multiplo3 ya están en la columna "Numero" en distintos registros, y por eso no los quiero.

Estas son mis pruebas con mis resultados:

Código SQL:
Ver original
  1. USE Numeros
  2. SELECT multiplo1,multiplo2,multiplo3
  3. FROM Numeros
  4. WHERE Codigo IN ('A','B','C') AND (multiplo1 NOT IN (SELECT Numero FROM Numeros)
  5. OR multiplo2 NOT IN (SELECT Numero FROM Numeros)
  6. OR multiplo3 NOT IN (SELECT Numero FROM Numeros))
  7. GO
Esta consulta me da el siguiente resultado:
Código:
multiplo1	multiplo2	multiplo3
2		NULL		4
NULL		6		NULL
14		21		NULL
Con lo cual no me vale, puesto que el nº 2 (multiplo1 de la primera fila de resultados) no me interesa, puesto que ya existe un registro con el nº 2 en campo Numero. Lo mismo le pasa al 21.
Con este código única y exclusivamente me excluye los registros que coinciden que tanto multiplo1,multiplo2 y multiplo3 ya tienen registros con esos números en campo Numero (o son NULL)

Ahora cojo y hago la siguiente consulta:
Código SQL:
Ver original
  1. SELECT multiplo1
  2. FROM Numeros
  3. WHERE Codigo IN ('A','B','C') AND multiplo1 NOT IN(SELECT Numero FROM Numeros)
  4. [/CODE]Y este es el resultado:[CODE]
  5. multiplo1
  6. 14
Así pues... bravo!! Este es el único resultado de multiplo1 que no está en ningún registro como número.

Así pues, una solución sería hacer 3 consultas distinas, una para cada múltiplo.

Sin embargo... volviendo a mi problema original, que son 50 columnas... serían 50 consultas distintas.

Como podría juntarlas en solo 1? Es decir, como se podrían juntar estas 2:
Código SQL:
Ver original
  1. SELECT multiplo1
  2. FROM Numeros
  3. WHERE Codigo IN ('A','B','C') AND multiplo1 NOT IN(SELECT Numero FROM Numeros)


Código SQL:
Ver original
  1. SELECT multiplo2
  2. FROM Numeros
  3. WHERE Codigo IN ('A','B','C') AND multiplo2 NOT IN(SELECT Numero FROM Numeros)

---------------

Edito:

Acabo de descubrir la cláusula UNION O UNION ALL y esta es mi nueva consulta:

Código SQL:
Ver original
  1. SELECT multiplo1 AS Multiplos
  2. FROM Numeros
  3. WHERE Codigo IN ('A','B','C') AND multiplo1 NOT IN(SELECT Numero FROM Numeros)
  4. UNION
  5. SELECT multiplo2
  6. FROM Numeros
  7. WHERE Codigo IN ('A','B','C') AND multiplo2 NOT IN(SELECT Numero FROM Numeros)
  8. UNION
  9. SELECT multiplo3
  10. FROM Numeros
  11. WHERE Codigo IN ('A','B','C') AND multiplo3 NOT IN(SELECT Numero FROM Numeros)
  12. GO
Y este es el resultado:
Código:
multiplos
4
6
14
No es exactamente lo que buscaba pero me vale (Solo tengo que adaptarlo a mi programa de esta manera), al fin y al cabo son los datos que quería, pero organizados de una manera distinta a la que buscaba. Pero igualmente solo adapto el código de mi programa (desde el cual se hace la consulta) y arreglado.

Sin embargo, si a alguien se le ocurre como hacer que cada múltiplo esté en una columna distinta... será bien recibida la respuesta.

Última edición por gnzsoloyo; 25/05/2015 a las 00:33