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

[SOLUCIONADO] Problema de lógica

Estas en el tema de Problema de lógica en el foro de Bases de Datos General en Foros del Web. Hola. Tengo un problema con una consulta y que debe estar en la lógica. Tengo dos tablas que tienen los datos de rasgos morfológicos: Una ...
  #1 (permalink)  
Antiguo 10/02/2011, 14:02
 
Fecha de Ingreso: mayo-2007
Ubicación: Córdoba, Argentina
Mensajes: 56
Antigüedad: 17 años
Puntos: 1
Problema de lógica

Hola. Tengo un problema con una consulta y que debe estar en la lógica.

Tengo dos tablas que tienen los datos de rasgos morfológicos:

Una con los grupos morfológicos (CFG_GRUPOS_MORFOLOGIAS) con un ID y una descripcion.

Otra tabla con los tipos que corresponden a esos grupos (CFG_RAZGOS_MORFOLOGICOS) con un ID, un ID del grupo al que pertenecen y una descripcion.

Así un rasgo se forma con un grupo y un rasgo; por ejemplo: PIERNA IZQUIERDA / COMBADA.

El tema es que tengo que hacer un filtro como el siguiente:

Código:
select rm.id_grupo_morfologia, rm.id_razgo_morfologico, gm.desc_grupo_morfologia, rm.desc_razgo_morfologico 
from CFG_GRUPOS_MORFOLOGIAS gm
inner join CFG_RAZGOS_MORFOLOGICOS rm on gm.id_grupo_morfologia=rm.id_grupo_morfologia
where 1 = 1
and upper(gm.desc_grupo_morfologia) like upper('%pierna-izq%')
donde saco todas los rasgos con la pierna izquierda.

El tema es que tambien quiero que me filtre algunos rasgos de ese subgrupo; por ejemplo que no aparezca la pierna izquierda(id=40) combada(id=2).

He probado agregar al final

Código:
and rm.id_grupo_morfologia<>40 and rm.id_razgo_morfologico <> 2
con lo que me sacaba TODOS los registros con id 40 y yo solo quiero sacar del 40 el que tenga rasgo 2.

Si alguien me da una mano estaré a la espera.

Un abrazo

Adrian
  #2 (permalink)  
Antiguo 10/02/2011, 15:38
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 9 meses
Puntos: 774
Respuesta: Problema de lógica

Código SQL:
Ver original
  1. SELECT rm.id_grupo_morfologia, rm.id_razgo_morfologico, gm.desc_grupo_morfologia, rm.desc_razgo_morfologico
  2. FROM CFG_GRUPOS_MORFOLOGIAS gm
  3. INNER JOIN CFG_RAZGOS_MORFOLOGICOS rm ON gm.id_grupo_morfologia=rm.id_grupo_morfologia
  4. WHERE 1 = 1
  5. AND UPPER(gm.desc_grupo_morfologia) LIKE UPPER('%pierna-izq%')
  6. AND rm.id_grupo_morfologia NOT IN (SELECT id_grupo_morfologia FROM CFG_RAZGOS_MORFOLOGICOS  WHERE
  7. id_grupo_morfologia=40 AND id_razgo_morfologico= 2
  8. )

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 10/02/2011, 16:02
 
Fecha de Ingreso: mayo-2007
Ubicación: Córdoba, Argentina
Mensajes: 56
Antigüedad: 17 años
Puntos: 1
Respuesta: Problema de lógica

Hola Libras:

El script me elimina todo el grupo 40 y yo solo necesito eliminar el par (si se me permite) 40 / 2 (uno del id del grupo y otro del id del rasgo). Se deben cumplir las dos condiciones.

Gracias
  #4 (permalink)  
Antiguo 10/02/2011, 16:25
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 9 meses
Puntos: 774
Respuesta: Problema de lógica

Código SQL:
Ver original
  1. SELECT rm.id_grupo_morfologia, rm.id_razgo_morfologico, gm.desc_grupo_morfologia, rm.desc_razgo_morfologico
  2. FROM CFG_GRUPOS_MORFOLOGIAS gm
  3. LEFT JOIN CFG_RAZGOS_MORFOLOGICOS rm ON gm.id_grupo_morfologia=rm.id_grupo_morfologia
  4. WHERE 1 = 1
  5. AND UPPER(gm.desc_grupo_morfologia) LIKE UPPER('%pierna-izq%')
  6. AND rm.id_razgo_morfologico <> 2

Prueba con esto
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 10/02/2011, 16:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Problema de lógica

Hola adriannjimenez,

¿qué manejador de BD estás utilizando? si su manejador soporta la función EXCEPT o algo por el estilo, puedes utilizarla, pero si utilizas por ejemplo mysql (que no soporta esta función) se me ocurre que puedas hacer algo como lo siguiente:


Código SQL:
Ver original
  1. SELECT rm.id_grupo_morfologia, rm.id_razgo_morfologico, gm.desc_grupo_morfologia, rm.desc_razgo_morfologico
  2. FROM CFG_GRUPOS_MORFOLOGIAS gm
  3. INNER JOIN CFG_RAZGOS_MORFOLOGICOS rm ON gm.id_grupo_morfologia=rm.id_grupo_morfologia
  4. WHERE 1 = 1
  5. AND UPPER(gm.desc_grupo_morfologia) LIKE UPPER('%pierna-izq%')
  6. AND concat(rm.id_grupo_morfologia, '-', rm.id_razgo_morfologico) <> '40-2'

No es una solución muy elegante, pero a estas horas y sin haber comido es lo único que se me ocurre

y ojo con la condición 1=1... no tienen ninguna razón de ser.

saludos, y si encuentro alguna mejor respuesta mañana la publico.
Leo.
  #6 (permalink)  
Antiguo 10/02/2011, 16:48
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 2 meses
Puntos: 300
Respuesta: Problema de lógica

Tienes que explicar con precisión lo que buscas, pues si buscas la pierna izquierda combada
SELECT rm.id_grupo_morfologia, rm.id_razgo_morfologico, gm.desc_grupo_morfologia, rm.desc_razgo_morfologico
FROM CFG_GRUPOS_MORFOLOGIAS gm
INNER JOIN CFG_RAZGOS_MORFOLOGICOS rm ON gm.id_grupo_morfologia=rm.id_grupo_morfologia
WHERE rm.id_grupo_morfologia = 40 AND id_razgo_morfologico = 2

Cuando digas que no aparezca la pierna izquierda combada, precisa que cualquier otro miembro, incluida la pierna izquierda, siempre que no sea combada. Ese tipo de aclaraciones son necesarias.

Tal vez la pierna izquierda, pero no combada
SELECT rm.id_grupo_morfologia, rm.id_razgo_morfologico, gm.desc_grupo_morfologia, rm.desc_razgo_morfologico
FROM CFG_GRUPOS_MORFOLOGIAS gm
INNER JOIN CFG_RAZGOS_MORFOLOGICOS rm ON gm.id_grupo_morfologia=rm.id_grupo_morfologia
WHERE rm.id_grupo_morfologia = 40 AND id_razgo_morfologico != 2

Aclara con mucha precisión lo que quieres.
  #7 (permalink)  
Antiguo 10/02/2011, 17:27
 
Fecha de Ingreso: mayo-2007
Ubicación: Córdoba, Argentina
Mensajes: 56
Antigüedad: 17 años
Puntos: 1
Respuesta: Problema de lógica

Gracias a todos por el tiempo y voy a explicar para ser más claro.

Libras: Con la sentencia filtro todos los rasgos con id 2 de los grupos que pueda buscar.

Leonardo_josue: Uso SQL SERVER y no me reconoce la sentencia concat. Si yo quise usar algo como
Código:
and (rm.id_grupo_morfologia, id_razgo_morfologico) != (40,2)
pero no le gusta.

Jurena: Empecemos por el principio. La pantalla es una búsqueda donde se filtran los rasgos morfológicos ya elegidos.
Acá va la pantalla:


Uploaded with ImageShack.us

Como verán puedo elegir por el grupo y/o por el rasgo. Además guardo en la sesión los rasgos (el par id_grupo,id_rasgo) que ya están elegidos para que no lo muestre.

La lógica sería que filtre por los textos y por los pares CONJUNTOS de grupo y rasgo.

Espero haber aclarado un poco más para ver si hay alguna forma de resolverlo.

Agradezco el tiempo que se están tomando para ayudarme.

Un abrazo.

Adrian
  #8 (permalink)  
Antiguo 10/02/2011, 17:34
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 9 meses
Puntos: 774
Respuesta: Problema de lógica

Pon un ejemplo de tus tablas y de los datos de las mismas para poder ayudarte mejor :)

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #9 (permalink)  
Antiguo 10/02/2011, 17:45
 
Fecha de Ingreso: mayo-2007
Ubicación: Córdoba, Argentina
Mensajes: 56
Antigüedad: 17 años
Puntos: 1
Respuesta: Problema de lógica

Hola Libras: Que velocidad!!!

Te cuento que son dos tablas:

En la primera:
CFG_GRUPOS_MORFOLOGIAS
id_grupo_morfologia PK
desc_grupo_morfologia nvarchar
Por ejemplo:
1-CUTIS / 2-CONTEXTURA / 3-OREJAS-CONFORMACION / 4-OREJAS-CARACTERISTICAS / 5-PRONUNCIACION-ACENTO

y así con todos los grupos.

CFG_RAZGOS_MORFOLOGICOS
id_grupo_morfologia PK
id_razgo_morfologico PK
desc_razgo_morfologico
Acá se desagregan cada grupo, por ejemplo:
(De cutis) 1-1-ASIATICO / 1-2-TRIGUEÑO / 1-3-BLANCO / 1-4-NEGRO

y así con cada grupo se reitera el primer valor y el segundo se numera.
Por lo que puede haber VARIOS registros en CFG_RAZGOS_MORFOLOGICOS con el valor 2, uno por cada uno de los grupos.

Por eso el filtro lo puedo hacer por la descripcion del grupo y/o por la descripcion del rasgo y/o por el valor conjunto de los dos ID de la tabla de los rasgos (y acá está el problema).

Espero haber aclarado.

Un abrazo y gracias.

Adrian
  #10 (permalink)  
Antiguo 10/02/2011, 19:27
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 4 meses
Puntos: 10
Respuesta: Problema de lógica

....?
Haber si puedo ayudar, tienes la siguiente data y que consulta quieres obtener?, no me queda del todo claro


Código:
SELECT GM.id_grupo_morfologia, GM.desc_grupo_morfologia, RM.id_razgo_morfologico, RM.desc_razgo_morfologico
FROM CFG_GRUPOS_MORFOLOGIAS AS GM INNER JOIN CFG_RAZGOS_MORFOLOGICOS AS RM ON GM.id_grupo_morfologia=RM.id_grupo_morfologia
WHERE RM.id_razgo_morfologico='4'
  #11 (permalink)  
Antiguo 11/02/2011, 08:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 9 meses
Puntos: 774
Respuesta: Problema de lógica

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT,
  4. dato VARCHAR(200)
  5. )
  6.  
  7. CREATE TABLE #temp2
  8. (
  9. id INT,
  10. id_dato INT,
  11. descrip VARCHAR(200)
  12. )
  13.  
  14. INSERT INTO #temp (id,dato) VALUES (1,'dato1')
  15. INSERT INTO #temp (id,dato) VALUES (2,'dato2')
  16. INSERT INTO #temp (id,dato) VALUES (3,'dato3')
  17. INSERT INTO #temp (id,dato) VALUES (40,'dato4')
  18.  
  19. INSERT INTO #temp2 (id_dato,id,descrip) VALUES (1,1,'dato1_1')
  20. INSERT INTO #temp2 (id_dato,id,descrip) VALUES (40,1,'dato_40_1')
  21. INSERT INTO #temp2 (id_dato,id,descrip) VALUES (40,2,'dato_40_2')
  22. INSERT INTO #temp2 (id_dato,id,descrip) VALUES (40,3,'dato_40_3')
  23. INSERT INTO #temp2 (id_dato,id,descrip) VALUES (40,4,'dato_40_4')
  24.  
  25.  
  26. SELECT * FROM #temp t
  27. LEFT JOIN #temp2 t1 ON (t.id=t1.id_dato)
  28. WHERE t1.id <> 2
  29. AND UPPER(t.dato) LIKE UPPER('%dato4%')

Y regresa estos valores:


id dato id id_dato descrip
40 dato4 1 40 dato_40_1
40 dato4 3 40 dato_40_3
40 dato4 4 40 dato_40_4


Que es lo que estas buscando no? todos los valores de 40 en donde no aparezca 40-2 que es el que seleccionaron.... o me equivoco???

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #12 (permalink)  
Antiguo 11/02/2011, 09:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Problema de lógica

Compañero adriannjimenez:

Creo que no leíste el comentario que te hice en mi post:

Cita:
si su manejador soporta la función EXCEPT o algo por el estilo, puedes utilizarla,
Según lo que entendí el id_razgo_morfología podría repetirse para cada grupo, es decir, puedes tener algo como esto en tu tabla CFG_RAZGOS_MORFOLOGICOS:

Código:
1	1	ASIATICO
1	2	TRIGUEÑO
1	3	BLANCO
1	4	NEGRO
2	1	OTRO
2	2	UNO MAS
3	1	LO QUE SEA
Por lo tanto las soluciones que proponen los compañeros Libras y franko1809 no aplican, ya que ellos están considerando que el id_razgo_morfología es único para cada registro.

Ahora bien, supongamos que de esta tabla tú quieres filtras sólo el registro 2-1 "OTRO" puedes hacerlo así:

Código SQL:
Ver original
  1. DECLARE @CFG_RAZGOS_MORFOLOGICOS TABLE (id_grupo_morfologia INT, id_razgo_morfologico INT, desc_razgo_morfologico nvarchar(50));
  2. INSERT INTO @CFG_RAZGOS_MORFOLOGICOS VALUES (1, 1, 'ASIATICO')
  3. INSERT INTO @CFG_RAZGOS_MORFOLOGICOS VALUES (1, 2, 'TRIGUEÑO')
  4. INSERT INTO @CFG_RAZGOS_MORFOLOGICOS VALUES (1, 3, 'BLANCO')
  5. INSERT INTO @CFG_RAZGOS_MORFOLOGICOS VALUES (1, 4, 'NEGRO')
  6. INSERT INTO @CFG_RAZGOS_MORFOLOGICOS VALUES (2, 1, 'OTRO')
  7. INSERT INTO @CFG_RAZGOS_MORFOLOGICOS VALUES (2, 2, 'UNO MAS')
  8. INSERT INTO @CFG_RAZGOS_MORFOLOGICOS VALUES (3, 1, 'LO QUE SEA')
  9.  
  10. SELECT * FROM @CFG_RAZGOS_MORFOLOGICOS
  11.  
  12. SELECT *
  13. FROM @CFG_RAZGOS_MORFOLOGICOS T1
  14. EXCEPT
  15. (SELECT *
  16. FROM @CFG_RAZGOS_MORFOLOGICOS T2
  17. WHERE
  18. id_grupo_morfologia = 2 AND id_razgo_morfologico = 1)

Si checas el ejemplo, la primer consulta te regresa los 7 registros, la segunda, utilizando el operador EXCEPT te filtra el registro 2-1, mostrando los restantes 6.

Puedes meter esto como una subconsulta para poder hacer el INNER JOIN con tu otra tabla. Haz la prueba y nos comentas

Saludos
Leo
  #13 (permalink)  
Antiguo 11/02/2011, 10:28
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 4 meses
Puntos: 10
Respuesta: Problema de lógica

Cita:
Iniciado por leonardo_josue Ver Mensaje
Según lo que entendí el id_razgo_morfología podría repetirse para cada grupo, es decir, puedes tener algo como esto en tu tabla CFG_RAZGOS_MORFOLOGICOS:

Código:
1	1	ASIATICO
1	2	TRIGUEÑO
1	3	BLANCO
1	4	NEGRO
2	1	OTRO
2	2	UNO MAS
3	1	LO QUE SEA
Segun la logica esto que mencionas no podria suceder ya que la relacion es de 1 a muchos y por lo tanto el id_razgo_morfologico es primary key y efectivamente se puede repetir pero con el mismo contenido sino es asi entonces ESTA MAL LA LOGICA y es un mal diseño de la BD y esto se llama inconsistencia de datos, siguiendo tus datos seria asi
Código:
2	1	ASIATICO
1	2	TRIGUEÑO
1	3	BLANCO
1	1	ASIATICO
1	4	NEGRO
2	2	TRIGUEÑO
3	1	ASIATICO
En todo caso esperemos haber que dice el creador del tema, si colocas un par de registros mas siguiendo la data de la imagenes que coloque otros usuarios se podrian dar cuenta mejor cual es el problema y que es lo que buscas, por otro lado una vez esto hecho podrias abrir otro tema donde la pregunta este mas clara por que ya se ha hecho extenso y otros usuarios no creo que se pongan a seguir el tema y no recibiras ayuda de mas usuarios, saludos

Última edición por franko1809; 11/02/2011 a las 10:34
  #14 (permalink)  
Antiguo 11/02/2011, 13:27
 
Fecha de Ingreso: mayo-2007
Ubicación: Córdoba, Argentina
Mensajes: 56
Antigüedad: 17 años
Puntos: 1
Respuesta: Problema de lógica

Bien. Somos un montón para resolver ésto.

Viendo la pantalla que puse arriba es un buscador. Por ejemplo que quiero agregar un rasgo de la pierna izquierda entonces haría:



Uploaded with ImageShack.us

Pero resulta que yo no quiero que me aparezca en el listado el quinto registro (41-4-PIERNA IZQUIERDA-COMBADA) porque, hagamos que ya lo elegí y tengo guardado el par 41/4 en una variable de session.

Ahora está en qué le agrego al where del select para que me aparezca ese mismo listado sin el registro con las claves 41/5.

Espero que se les encienda la lamparita que yo ya fundí la instalación eléctrica.

Voy a probar lo del EXCEPT que no sé si lo habilita el SQL SERVER,

Un abrazo para todos y GRACIAS.

Adrian
  #15 (permalink)  
Antiguo 11/02/2011, 13:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 9 meses
Puntos: 774
Respuesta: Problema de lógica

Y los datos de la segunda tabla??

Porque probe el query que te mande con esos datos y me regresa la info que necesitas

Código SQL:
Ver original
  1. SELECT * FROM #temp t
  2. LEFT JOIN #temp2 t1 ON (t.id=t1.id_dato)
  3. WHERE t1.id <> @tu_dato
  4. AND UPPER(t.dato) LIKE UPPER('%nombre a buscar%')

Regresa todos los registros menos el que tienes marcado (nombre_buscar-tu_dato) en este caso (40-1)

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Última edición por Libras; 11/02/2011 a las 14:00
  #16 (permalink)  
Antiguo 11/02/2011, 14:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Problema de lógica

Cita:
Iniciado por franko1809 Ver Mensaje
Segun la logica esto que mencionas no podria suceder ya que la relacion es de 1 a muchos y por lo tanto el id_razgo_morfologico es primary key y efectivamente se puede repetir pero con el mismo contenido sino es asi entonces ESTA MAL LA LOGICA y es un mal diseño de la BD y esto se llama inconsistencia de datos
Franko: no sé por qué mencionas que los datos que coloco no podría suceder. Creo que te estás olvidando de las llaves primarias compuestas. El primer campo corresponde efectivamente al grupo morfológico, mientras que la unión de los campos 1 y 2 podría formar parte de la llave de rasgos. Eso por supuesto que no lo puedo asegurar, depende del compañero Adrián verificar si la lógica es correcta o no.

Adrián: el operador EXCEPT es soportado a partir de la versión 2005 y posteriores de SQL Server por lo que si utilizas alguna de estas ver. el ejemplo deberá funcionar sin problemas.

Si estás utilizando SQL Server 2000 entonces podrías retomar la lógica que te puse con el concat, sólo que aplicando la sintaxis correcta para SQL Server. Como tus campos son tipo numérico tendrías que poner algo como esto:

Código SQL:
Ver original
  1. SELECT rm.id_grupo_morfologia, rm.id_razgo_morfologico, gm.desc_grupo_morfologia, rm.desc_razgo_morfologico
  2. FROM CFG_GRUPOS_MORFOLOGIAS gm
  3. INNER JOIN CFG_RAZGOS_MORFOLOGICOS rm ON gm.id_grupo_morfologia=rm.id_grupo_morfologia
  4. WHERE 1 = 1
  5. AND UPPER(gm.desc_grupo_morfologia) LIKE UPPER('%pierna-izq%')
  6. AND CAST(rm.id_grupo_morfologia AS VARCHAR) + '-' + CAST(rm.id_razgo_morfologico AS VARCHAR) != '40-2'

Y como comenta acertadamente franko1809 creo que el tema ya se extendió demasiado y tal pareciera que aun no terminamos de entender la problemática. Igual y sería conveniente que si continuas con problemas abras otro tema y comenzar desde cero, tratando de plantear mejor las cosas

Saludos
Leo.
  #17 (permalink)  
Antiguo 11/02/2011, 19:37
 
Fecha de Ingreso: mayo-2007
Ubicación: Córdoba, Argentina
Mensajes: 56
Antigüedad: 17 años
Puntos: 1
Respuesta: Problema de lógica

Hola a todos:

Vamos por parte. El resultado que puse es el join de las dos tablas ya combinadas y con el filtro aplicado.

Leonardo: El EXCEPT me funcionó barbaro con una condición como verás en la imagen (no aparece el registro 41/4).



Uploaded with ImageShack.us

Ahora como hago para agregarle otras excepciones. Es la primera vez que escucho de esta sentencia.

Les agradezco la atención y las ganas puestas.

Adrian

PD: También probé el casteo y funciona bien. Creo que usaré esa porque me parece más sencillo de agregarles condiciones "and". Igualmente si me podés responder la duda con el EXCEPT, te lo agradezco.
Un abrazo a todos.
  #18 (permalink)  
Antiguo 11/02/2011, 21:42
 
Fecha de Ingreso: enero-2008
Ubicación: Lima - Perú
Mensajes: 1.127
Antigüedad: 16 años, 4 meses
Puntos: 10
Respuesta: Problema de lógica

Tambien podrias haber utilizado el NOT IN que me parece hace lo mismo que el EXCEPT en fin puedes probar el costeo haber con cual va mejor.

Si lo que preguntas es como utilizar varios except simplemente los agregas .....EXCEPT(condicion) EXCEPT(condicion).
  #19 (permalink)  
Antiguo 12/02/2011, 04:37
 
Fecha de Ingreso: mayo-2007
Ubicación: Córdoba, Argentina
Mensajes: 56
Antigüedad: 17 años
Puntos: 1
Respuesta: Problema de lógica

Hola:

Te comento que usé el NOT IN y no me funcionó porque me daba un error. Por eso planté este post. Además, ¿ el NOT IN/IN no se usa para buscar si UN campo no posee/posee un valor de una lista?

Un abrazo.
  #20 (permalink)  
Antiguo 12/02/2011, 06:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 2 meses
Puntos: 300
Respuesta: Problema de lógica

Prueba primero con el except, porque quizás te funcione, pero yo te propongo otra cosa. Espero no decir una tontería. Observa.

Con esto primero selecciono todo lo de la pierna izquierda, quitando los rasgos morfológicos 4 y 5.

SELECT rm.id_grupo_morfologia, rm.id_razgo_morfologico, gm.desc_grupo_morfologia, rm.desc_razgo_morfologico
FROM CFG_GRUPOS_MORFOLOGIAS gm
INNER JOIN CFG_RAZGOS_MORFOLOGICOS rm ON gm.id_grupo_morfologia=rm.id_grupo_morfologia
WHERE rm.id_grupo_morfologia = 41 AND (rm.id_grupo_morfologia = 41AND rm.id_razgo_morfologico !=4) AND (rm.id_grupo_morfologia = 41 AND rm.id_razgo_morfologico != 5)
es decir, cada vez que añades una excepción, añades un AND con un AND entre paréntesis, en que repites el dato del id_grupo_morfologia y añades la excepción con !=
  #21 (permalink)  
Antiguo 12/02/2011, 17:46
 
Fecha de Ingreso: mayo-2007
Ubicación: Córdoba, Argentina
Mensajes: 56
Antigüedad: 17 años
Puntos: 1
Respuesta: Problema de lógica

Hola Jurena:

Mirá el paréntesis no hace que se "parta" la sentencia creando prioridades. Probé con el cast y eso funcionó bárbaro.

Muchas gracias por el tiempo que se tomaron para ayudarme.

Un abrazo

Adrian
  #22 (permalink)  
Antiguo 13/02/2011, 06:02
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 2 meses
Puntos: 300
Respuesta: Problema de lógica

adriannjimenez,
en realidad, esa solución no es la correcta, porque es redundante, deberías usar
WHERE rm.id_grupo_morfologia = 41 AND rm.id_razgo_morfologico !=4 AND rm.id_razgo_morfologico != 5
es decir, una vez elegido el campo1, lo mantienes y sólo añades los siguientes, en este caso sin paréntesis, ya que no se trata del mismo campo, pero observé que querías hacer varias cosas a la vez, y estabas cargando en una variable de sesión los dos datos. Tienes que estudiar todas las posibilidades de búsqueda sobre un campo y otro, y mediante programación y el uso de =, !=, LIKE, <>, OR, AND, XOR, NOT, etc., y con el uso adecuado de paréntesis, preparar las consultas, de acuerdo con las selecciones hechas.

Suerte.

Última edición por jurena; 13/02/2011 a las 08:56

Etiquetas: bases-de-datos
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 19:27.