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

[SOLUCIONADO] Consulta con NOT IN no devuelve lo que debería

Estas en el tema de Consulta con NOT IN no devuelve lo que debería en el foro de SQL Server en Foros del Web. Hola amigos que tal todo, soy nuevo por aquí como veréis, aunque os leo desde hace tiempo. Pues veréis tengo un problemilla en t-sql, soy ...
  #1 (permalink)  
Antiguo 24/05/2014, 05:39
 
Fecha de Ingreso: mayo-2014
Mensajes: 44
Antigüedad: 9 años, 11 meses
Puntos: 10
Pregunta Consulta con NOT IN no devuelve lo que debería

Hola amigos que tal todo, soy nuevo por aquí como veréis, aunque os leo desde hace tiempo. Pues veréis tengo un problemilla en t-sql, soy nuevecillo con él. La cosa es que tengo esta consulta:

Código SQL:
Ver original
  1. SELECT m.CONVERSACION_id ID, m.autor USUARIO, c.asunto ASUNTO, m.textoMensaje MENSAJE, m.fecha FECHA
  2. FROM CONVERSACION c, MENSAJE_PRIVADO m
  3. WHERE m.destinatario = 'pepito' AND
  4. m.id NOT IN(
  5. SELECT mpb.id_MENSAJE FROM MENSAJE_PRIVADO_BORRADO mpb WHERE mpb.usuario =  'pepito'
  6. )  AND
  7. c.id = m.CONVERSACION_id

El problema está cuando la subquery
Código SQL:
Ver original
  1. SELECT mpb.id_MENSAJE FROM MENSAJE_PRIVADO_BORRADO mpb WHERE mpb.usuario =  'pepito'
me devuelve un solo resultado, que no lo tiene en cuenta, si hay dos o más no hay problema, pero cuando solo devuelve uno no hace caso y me lo selecciona.

¿Alguien tiene una idea del porqué? Muchas gracias de antemano y saludos!
  #2 (permalink)  
Antiguo 24/05/2014, 06:12
 
Fecha de Ingreso: mayo-2014
Mensajes: 44
Antigüedad: 9 años, 11 meses
Puntos: 10
Respuesta: Consulta con NOT IN no devuelve lo que debería

Bah, me respondo yo mismo, a veces preguntando las cosas llegas a la solución jeje. El problema era simplemente que no quería recoger el m.CONVERSACION_id si no el m.id en la select, y claro me devolvía lo que no quería ver..... cosa tonta tonta.

Saludos!
  #3 (permalink)  
Antiguo 26/05/2014, 12:42
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta con NOT IN no devuelve lo que debería

Cambia tu NOT IN, por un NOT EXISTS
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 26/05/2014, 13:11
 
Fecha de Ingreso: abril-2012
Ubicación: Capital Federal
Mensajes: 283
Antigüedad: 12 años
Puntos: 15
Respuesta: Consulta con NOT IN no devuelve lo que debería

Cita:
Iniciado por iislas Ver Mensaje
Cambia tu NOT IN, por un NOT EXISTS
Por algo en especial iislas sugeris el cambio a EXISTS??
  #5 (permalink)  
Antiguo 26/05/2014, 14:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta con NOT IN no devuelve lo que debería

El comportamiento de ambas formas es levemente diferente e casi todos los DBMS.
El IN() requiere comparación contra los valores obtenidos, pero el EXISTS o NOT EXISTS sólo requiere que haya al menos un valor devuelto, sin necesidad de identificar cuál, en tanto que se cumpla la relación de la subquery.
Performáticamente hablando, en ciertas consultas EXISTS suele ser más eficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 26/05/2014, 14:15
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Consulta con NOT IN no devuelve lo que debería

En pocos registros, creo que no es algo que se pueda comprobar, pero (lo he hecho), con MILLONES de registros, se puede ver que es mucho mas eficiente el NOT EXISTS
__________________
MCTS Isaias Islas

Etiquetas: sql
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 20:38.