Ver Mensaje Individual
  #5 (permalink)  
Antiguo 28/12/2012, 03:40
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 5 meses
Puntos: 2658
Respuesta: Consulta de tres tablas

Cita:
Me saca los resultados de una sola a.ID, cuando varias a.ID pueden estar asociadas al -> a.code = "1420-21312"
Estás mirando mal la cosa.
Puede ser cierto que en el campo "code" de la tabla "annotations" haya múltiples registros donde aparezca el valor "1420-21312", pero sólo hay un único registro donde se cumplen todas las otras condiciones que propones al mismo tiempo, y en esa consulta tu estás poniendo cinco (5) restricciones de integridad relacional y dos condiciones de filtrado, o sea siete condiciones que cumplir.
Ese es el tema.
Los JOINs que planteas son mandatorios, por lo que sólo devolverá registros si se cumplen todos.
Ahora bien, si quieres efectivamente que devuelva todos los registros de la tabla anotations que tengan ese valor en ese campo, deberás determinar qué relaciones con las otras tablas son en realidad opcionales, es decir, valores no mandatorios, o cuáles no están cumpliendo las restricciones.
Cuando un valor es opcional hay que usar LEFT JOIN o RIGHT JOIN según el caso, pero para ello hay que adaptar la sintaxis y orden de las tablas a fin de evitar productos cartesianos o resultados erróneos por cadenas de dependencias mal definidas.
En definitiva, quiero que entiendas dos cosas:
1) Si devuelve lo mismo que lo que desarrollaste, significa que la lógica simplificada de lo que te propongo es equivalente, solo que más optimizado, cosa que notarás con muuuuchos datos.
2) No existe "error" en la consulta, sino en todo caso restricciones que no se están cumpliendo, o datos que en realidad no están relacionados o no están completos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)