PDA

Ver la Versión Completa : obtener filas que contienen unos datos y no contienen otros datos


Angel
05-06-2003, 15:33:05
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

jhonny
05-06-2003, 16:26:37
Prueba con esto:

select codproveedor from tabla
where codarticulo=15 and
codarticulo=43 and
codarticulo<>20

espero te sirva.

Investment
05-06-2003, 16:43:41
Y si solo quieres un registro por cada proveedor:


SELECT DISTINCT(codprveedor)
FROM Tabla
WHERE codarticulo=15
and codarticulo=43
and codarticulo<>20

Kafu
05-06-2003, 17:01:53
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... ?


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.

Kafu
05-06-2003, 17:03:46
Por cierto Johny aprovecho para darte mi enhorabuena. Un abrazo!

Kafu
05-06-2003, 17:07:44
Rectifico. He leído mal. Por ir de listo.
Creo que este query si valdría


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.

jhonny
05-06-2003, 17:20:10
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:

SELECT DISTINCT(codprveedor)
FROM Tabla
WHERE codarticulo=15
or codarticulo=43
and codarticulo<>20

Ahh, Y muchisimas gracias por tu enhorabuena Kafu;) :D

Angel
06-06-2003, 11:19:21
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

Angel
09-06-2003, 09:12:57
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?

Kafu
09-06-2003, 09:39:21
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.


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í:


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.

Angel
09-06-2003, 10:11:24
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%

Kafu
09-06-2003, 12:09:07
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.

Angel
09-06-2003, 13:17:28
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

Angel
09-06-2003, 15:07:05
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))

Kafu
10-06-2003, 10:11:23
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.