MySQL - No me funciona query con NOT IN

   
Vista:

No me funciona query con NOT IN

Publicado por Oscar (3 intervenciones) el 28/07/2008 23:13:22
Señores, tengo un problema.

tengo la siguiente query:

select idservicio,nombre
from rd_servicios
where idservicio not in (
select idservicio
from rd_dippublicas
where idpublica = 3);

En SQL Server me funciona el query, pero en MySQL no... alguien sabe la razón?
Le he tratado de dar vueltas al query, pero no se me ocurre otra manera de hacerlo.

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:No me funciona query con NOT IN

Publicado por Gonzalo GC (339 intervenciones) el 29/07/2008 01:03:49
¿A qué te refieres a que no funciona?
¿Te devuelve un error o simplemente no te devuelve datos?
En el primer caso, postea el mensaje que te devuelve.
En el segundo ¿estás seguro de tener al menos un registro con valores que pueda devolver?

Pruebalo de esta forma:

SELECT RDS.idservicio, RDS.nombre
FROM rd_servicios RDS INNER JOIN rd_dippublicas RDD USING (idservicio )
WHERE RDD .idpublica <> 3;

Si hay valores distintos en idpublica diferentes de 3 esa consulta debería devolverlos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No me funciona query con NOT IN

Publicado por Oscar (3 intervenciones) el 29/07/2008 01:12:13
Ok. No me devuelve nada. no es que me tire un error, aparentemente es un error lógico que tengo, pero en MS SQL si me funciona bien. La cosa es que en la tabla RD_SERVICIOS tengo propiamente la informacion de unos servicios y quiero que aparezcan únicamente los servicios que no posea la tabla RD_DIPPUBLICAS con un idpublica igual a 3.

Curiosamente el query:

select idservicio,nombre
from rd_servicios
where idservicio in (
select idservicio
from rd_dippublicas
where idpublica = 3);

Me funciona bien, me muestra los nombres de servicios que esta en la tabla RD_DIPPUBLICAS.

pero cuando coloco el NOT INT, debería mostrarme (así como MS SQL) los nombres de servicios que no estan en la tabla RD_DIPPUBLICAS.

select idservicio,nombre
from rd_servicios
where idservicio not in (
select idservicio
from rd_dippublicas
where idpublica = 3);

Me parece muy extraño...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No me funciona query con NOT IN

Publicado por Gonzalo GC (339 intervenciones) el 29/07/2008 03:08:48
Dices: "pero cuando coloco el NOT INT, debería mostrarme (así como MS SQL) los nombres de servicios que no estan en la tabla RD_DIPPUBLICAS. " (sic).

Veamos:
1. La consulta que estás usando es ANSI SQL, por lo que ambos motores la interpretan exactamente igual. De hecho es idéntica en Oracle, por lo que reafirmo que respeta el estándar de SQL-99.
2. ¿Buscas los registros de RD_SERVICIOS que no estén en RD_DIPPUBLICAS y que tengan idservicio =3 , o como dices en la cita, simplemente que no estén en RD_DIPPUBLICAS?
3. Si la consulta es correcta, puede que no exista un registro en RD_DIPPUBLICAS cuyo valor en el campo idservicio sea 3; solamente dando como respuesta NULL podría suceder que no devuelva registros en tanto los haya con otro valor, puesto que en ese caso la consulta principal no tiene contra qué realizar el matching de registros.
4. Finalmente existe otra posibilidad: Asunto de sintaxis propia de MySQL. En este sentido MySQL es heredero de C, ya que en ese lenguaje se creó el kernel, de modo que eso afecta algunos operadores. En este sentido deberías darte una vuelta por el manual oficial en la sección de subconsultas (http://dev.mysql.com/doc/refman/5.0/es/all-subqueries.html). Probemos esta posibilidad:

SELECT idservicio, nombre
FROM rd_servicios
WHERE NOT idservicio = ANY
(SELECT idservicio
FROM rd_dippublicas
WHERE idpublica = 3);

o bien:

SELECT idservicio, nombre
FROM rd_servicios
WHERE idservicio<> ALL
(SELECT idservicio
FROM rd_dippublicas
WHERE idpublica = 3);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:No me funciona query con NOT IN

Publicado por Oscar (3 intervenciones) el 29/07/2008 19:33:13
Muchas Gracias Gonzalo GC!
Quiero pedir disculpas primeramente porque en el título he puesto -No me funciona query con NOT INT- porque realmente no es que no funcione, sino que soy un cabeza dura jejejj.

Con lo que mensionaste en el punto 3...
"3. Si la consulta es correcta, puede que no exista un registro en RD_DIPPUBLICAS cuyo valor en el campo idservicio sea 3; solamente dando como respuesta NULL podría suceder que no devuelva registros en tanto los haya con otro valor, puesto que en ese caso la consulta principal no tiene contra qué realizar el matching de registros. "

No sé si lo interpreté bien, pero probé lo siguiente:

SELECT idservicio, nombre
FROM rd_servicios
WHERE idservicio not in
(SELECT idservicio
FROM rd_dippublicas
WHERE idpublica = 3 and idservicio is not null);

y ésto sí me funcionó! el problema es que habían registro con null en el campo idservicio de la tabla RD_DIPPUBLICAS.

Quiero disculparme también por mencionar que en MS SQL si funcionaba, porque realmente, revisando revisando, no funciona también. Lo que pasa es que estoy migrando una aplicación en PHP con MSSQL hacia MYSQL y pues no me había percatodo en ese errorsito que le había dejado en la aplicación (No llevo mucho tiempo haciendo ésta aplicación y ya la quiero migrar mejor a MySQL). De cualquier forma, funcionó todo bien y espero que de algo sirva ésta experiencia que tuve.

Quiero agradecerte a tí, Gonzalo, por la paciencia y tomarte la molestia de ayudarme. Thanks.

Dejo una imagen de como estaban las tablas y los datos para referencia:
http://www.4shared.com/file/57013783/a7f7f9f6/z0_online.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar