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

[SOLUCIONADO] consulta muy larga.

Estas en el tema de consulta muy larga. en el foro de SQL Server en Foros del Web. Buenas, Tengo una consulta que como es muy larga me lio un poco con ella. Porque tiene muchísimos campos en la select, y muchísimas condiciones, ...
  #1 (permalink)  
Antiguo 23/05/2015, 02:49
(Desactivado)
 
Fecha de Ingreso: marzo-2012
Mensajes: 366
Antigüedad: 12 años, 1 mes
Puntos: 31
consulta muy larga.

Buenas, Tengo una consulta que como es muy larga me lio un poco con ella. Porque tiene muchísimos campos en la select, y muchísimas condiciones, y cada una con una subconsulta en el where.

Tengo los siguientes campos: número, código, múltiplo1, múltiplo2,múltiplo3 [...] múltiplo50

Lo que quiero es que me diga qué múltiplos de registros cuyo código sea uno de 4 (A,B,C,D) no coinciden con el número en otro registro. Es decir... qué múltiplos no tienen su propio registro como número.

Mi consulta actual es:

SELECT
Multiplo1, Múltiplo2, Múltiplo3, [...], Multiplo50
FROM Numeros
WHERE Codigo IN ('A,'B','C','D') AND (
Multiplo1 NOT IN (SELECT Numero FROM Numeros)
OR Multiplo2 NOT IN (SELECT Numero FROM Numeros)
OR Multiplo3 NOT IN (SELECT Numero FROM Numeros)
OR Multiplo4 NOT IN (SELECT Numero FROM Numeros)
[..]
OR Multiplo50 NOT IN (SELECT Numero FROM Numeros))

Sin embargo me parece que no está demasiado optimizada. Y no se como hacerla mejor. A parte, como por ahora solo tengo 1 solo registro no se si esta consulta me daría lo esperado cuando tenga más.

Última edición por Kritik; 23/05/2015 a las 02:59
  #2 (permalink)  
Antiguo 23/05/2015, 09:22
(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
  #3 (permalink)  
Antiguo 24/05/2015, 23:53
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: consulta muy larga.

El problema es la complejidad..
Yo intentaría así:
Código SQL:
Ver original
  1. CREATE TABLE Numeros(Numero INT,Codigo  CHAR(1),multiplo1   INT,multiplo2   INT,multiplo3 INT);
  2. INSERT
  3. INTO    Numeros
  4. VALUES  (1,'A',2,NULL,4),
  5.         (2,'B',NULL,6,NULL),
  6.         (7,'A',14,21,NULL),
  7.         (21,'B',42,NULL,84),
  8.         (42,NULL,NULL,NULL,NULL),
  9.         (84,NULL,NULL,NULL,NULL);
  10.  
  11. SELECT  *
  12. FROM    Numeros N1
  13. WHERE   Codigo IN ('A','B','C','D')
  14.         AND EXISTS (SELECT *
  15.                 FROM    (VALUES (N1.multiplo1),
  16.                                 (N1.multiplo2),
  17.                                 (N1.multiplo3)) St(Numeros)
  18.                 WHERE   NOT EXISTS (SELECT  *
  19.                                 FROM    Numeros N2
  20.                                 WHERE   Numeros=N2.Numero));
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog

Etiquetas: campos, select, siguiente
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 14:01.