Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-06-2003
Angel Angel is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante, España
Posts: 58
Poder: 21
Angel Va por buen camino
obtener filas que contienen unos datos y no contienen otros datos

Me imagino que la cabecera del mensaje no os dirá mucho, pero es más dificil de explicar de lo que parece, sin embargo, lo intento a continuación:

Imaginaros que tengo una tabla con dos columnas, una que contiene el cod del proveedor y otra que contiene el código del artículo, de tal modo que tendría algo parecido a esto:

codProveed CodArticulo
-----------------------------------
1 15
1 20
1 43
2 15
2 43

Pues bien, mi pregunta es si puedo obtener los proveedores que, por ejemplo, distribuyan los artículos 15 y 43, y que a su vez NO distribuyan el artículo 20 ----> En el caso del ejemplo, quisiera que me devolviese el Proveedor 2


¿Existe para eso alguna consulta?


Muchas gracias a todos
Responder Con Cita
  #2  
Antiguo 05-06-2003
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Prueba con esto:

Código:
select codproveedor from tabla 
where codarticulo=15 and 
codarticulo=43 and 
codarticulo<>20
espero te sirva.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #3  
Antiguo 05-06-2003
Avatar de Investment
Investment Investment is offline
Miembro
 
Registrado: may 2003
Posts: 378
Poder: 21
Investment Va por buen camino
Y si solo quieres un registro por cada proveedor:

Código:
SELECT DISTINCT(codprveedor) 
  FROM Tabla
 WHERE codarticulo=15 
   and codarticulo=43 
   and codarticulo<>20
__________________
Saludos,
Peter Investment
Responder Con Cita
  #4  
Antiguo 05-06-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 21
Kafu Va por buen camino
No es por ser quisquiloso, pero me da la impresión de que donde hay un "AND" debiera haber un "OR".
No hay ningún registro que sea igual a 15 y a la vez igual a 43.
¿qué tal algo como... ?

Código:
select codproveedor from tabla 
where codarticulo in (15, 43)
and 
codarticulo<>20
Sé que es una simple erratilla, no os enfadeis. Un saludo,





F.T.G.
Responder Con Cita
  #5  
Antiguo 05-06-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 21
Kafu Va por buen camino
Por cierto Johny aprovecho para darte mi enhorabuena. Un abrazo!
Responder Con Cita
  #6  
Antiguo 05-06-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 21
Kafu Va por buen camino
Rectifico. He leído mal. Por ir de listo.
Creo que este query si valdría

Código:
select codproveedor from tabla 
where codarticulo in (15, 43)
and 
not codarticulo in (select codarticulo from tabla where codarticulo = 20)
Corregidme si me equivoco. Un saludo,








F.T.G.
Responder Con Cita
  #7  
Antiguo 05-06-2003
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Ahh, si muchas gracias Kafu por tu corrección pues es precisamente para eso que se crearon los foros ,
tienes razon...y aunque no he probado tu
consulta se ve bien...pero creo que esta tambien funcionaria:

Código:
SELECT DISTINCT(codprveedor) 
FROM Tabla
WHERE codarticulo=15 
or codarticulo=43 
and codarticulo<>20
Ahh, Y muchisimas gracias por tu enhorabuena Kafu
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #8  
Antiguo 06-06-2003
Angel Angel is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante, España
Posts: 58
Poder: 21
Angel Va por buen camino
hola a todos otra vez:

En primer lugar, muchiiiisimas gracias por responder, me había obstinado en hacer la consulta de una forma, y no conseguia los resultados, sin embargo, aun no he probado ninguna de las soluciones que me planteasteis, aunque creo que la que me servirá es la siguiente:

select codproveedor from tabla
where codarticulo in (15, 43)
and
not codarticulo in (select codarticulo from tabla where codarticulo = 20)



siempre que conde pone where codarticulo=20 pueda especificar where codarticulo in (20,x,y,z,...))

lo probaré este fin de semana y ya os contaré.

Otra vez, muchas gracias a todos
Responder Con Cita
  #9  
Antiguo 09-06-2003
Angel Angel is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante, España
Posts: 58
Poder: 21
Angel Va por buen camino
Hola a todos.... creo que las posibles soluciones que me planteasteis no funcionan: aqui os mando lo que he hecho y no hace lo que yo quiero

con esta consulta:

select * from pals_claves
where a_paciente=1642 and a_pals_claves in (91, 92)
and not a_pals_claves in (select a_pals_claves from pals_claves where a_pals_claves in (2,4,7))

obtenemos

a_pals_claves a_paciente
92 1642
91 1642

sobre una tabla con los siguientes datos:

a_pals_claves a_paciente
4 1642
7 1642
92 1642
91 1642
28 1642
15 1642
2 1642

¿no debería devolver ninguna fila?
Responder Con Cita
  #10  
Antiguo 09-06-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 21
Kafu Va por buen camino
Hola Angel, no sé si he entendido bien lo que quieres.
Lo que entiendo es que quieres todas las filas de un paciente determinado que no tenga ninguna clave 2, 4 ni 7.
Es decir entiendo que si en la tabla hay alguna fila de ese paciente con una de esas claves el paciente no debería salir.

Código:
select * from pals_claves 
where a_paciente=1642 and a_pals_claves in (91, 92) 
and not a_pals_claves in (select a_pals_claves from pals_claves where a_pals_claves in (2,4,7))
creo que el fallo está en el "and not". lo que debes seleccionar es el paciente, no la clave. Porque si pones la clave es como usar el operador "=" en la práctica. Yo el query lo pondría así:

Código:
select * from pals_claves 
where a_paciente=1642 and a_pals_claves in (91, 92) 
and not a_PACIENTE in (select a_PACIENTE from pals_claves where a_pals_claves in (2,4,7))
En ese caso creo que no devolvería ninguna fila.
No sé si es por donde quieres ir, comentalo. Un saludo,







F.T.G.
Responder Con Cita
  #11  
Antiguo 09-06-2003
Angel Angel is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante, España
Posts: 58
Poder: 21
Angel Va por buen camino
Hola Kafu y demás compañeros:

La verdad es que es dificil de explicar, pero voy a intentarlo, suponed que tenemos el paciente 1 al que se le aplican los siguientes tratamientos, el tratamiento 1,2,3,4,5,6.
Igual que este paciente, pueden haber un montón más con distintos tratamientos.

Pues bien, yo quiero poder elegir aquellos pacientes a los que se les haya aplicado un determinado tratamiento, por ejemplo el 1 y el 2, pero que a su vez no se le hayan aplicado exactamente el 3,4,5,6; de tal modo que:

¿me he conseguido explicar?..... ya sé que es dificil, pero la última solución propuesta no funcionaba al 100%
Responder Con Cita
  #12  
Antiguo 09-06-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 21
Kafu Va por buen camino
Yo creo que el último query tiene ese sentido. Algo hay que se me escapa. Habría dos criterios:


1.- quiero historiales de pacientes que hayan tomado aspirinas pero que nunca hayan tenido varicela

2.-quiero todos los historiales de toma de aspirina que no sean por varicela.

Si te entiendo bien el que tu quieres es el primero:

Selecciono los historiales de toma de aspirinas, pero de ellos voy a excluir los que pertenezcan a pacientes en cuya vida ha habido un historial de varicela, da igual que esté o no en la primera seleccion.
Entonces
select * from pacientes where medicina = aspirina and
not paciente in (seleccion de pacientes que hayan tenido varicela)
te debería funcionar.

El segundo criterio excluiría historiales de varicela, no pacientes, con lo cual se podría colar un historial de un paciente que tuviera otro historial de varicela.

Bueno que a lo mejor estoy encerrado en lo mío, no sé, cuentame cómo va.
Responder Con Cita
  #13  
Antiguo 09-06-2003
Angel Angel is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante, España
Posts: 58
Poder: 21
Angel Va por buen camino
Hola Kafu:

La query va perfecta, es decir, si yo escribo:

select * FROM TABLE1 WHERE A_PALS_CLAVES IN (91,92)
AND NOT A_PACIENTE IN (SELECT A_PACIENTE FROM TABLE1
WHERE A_PALS_CLAVES IN (2,4,7))

no me muestra ningun paciente, sin embargo, si yo pongo:

select * FROM TABLE1 WHERE A_PALS_CLAVES IN (91,92)
AND NOT A_PACIENTE IN (SELECT A_PACIENTE FROM TABLE1
WHERE A_PALS_CLAVES IN (2))

me debería mostrar el paciente

(estoy utilizando los siguientes datos):

a_pals_claves a_paciente
4 1642
7 1642
92 1642
91 1642
28 1642
15 1642
2 1642
Responder Con Cita
  #14  
Antiguo 09-06-2003
Angel Angel is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante, España
Posts: 58
Poder: 21
Angel Va por buen camino
Hola Kafu y demás compañeros:

La solución propuesta por Kafu era correcta, el que esta equivocado era yo (estaba un poco distraido esta mañana), por lo tanto, haciendo la query de abajo la consulta funciona bien

select distinct(a_paciente) from table1
where a_paciente in (select a_paciente from table1 where a_pals_claves in (91,92))
and a_paciente not in (select a_paciente from table1 where a_pals_claves in (3))
Responder Con Cita
  #15  
Antiguo 10-06-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 21
Kafu Va por buen camino
Nada pues me alegro, a veces estas consultas pueden ser un poco puñeteras. Seguro que habrá manera más optimizada, yo es que soy mucho de usar el IN( select...). Creo que a veces hay alternativas más eficientes pero ahora no se me ocurre. Venga un saludo,




F.T.G.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 22:25:05.


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