Ver Mensaje Individual
  #4 (permalink)  
Antiguo 25/01/2010, 17:17
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: 16 años, 5 meses
Puntos: 2658
Respuesta: Consulta de access a mysql

Todavía estoy tratando de entender lo que has puesto pero desde ya, a primera vista, es una consulta absolutamente redundante, como pocas veces he visto.
Si se analiza con cuidado pareciera que se está llamando cuatro veces al mismo modelo de consulta y cruzando las cuatro veces los mismos parámetros de JOIN.
En esencia, la consulta base sería esta:
Código MySQL:
Ver original
  1.     AU.ID_auditoria,
  2.     TT.`Tipo de tarea`
  3.   FROM
  4.     auditorias AU
  5.     INNER JOIN `asignacion de tareas` AT ON AU.ID_auditoria = AT.Auditoria
  6.     INNER JOIN tareas TA ON TA.Tarea = AT.ID_tareas
  7.     INNER JOIN `tipos de tareas` TT ON TA.Tipo = TT.ID_tipo_tarea
  8.     LEFT JOIN avance AV ON AT.Tarea = AV.ID_asignacion
  9.     AV.ID_avance IS NULL;
que parece destinada a obtener toda la lista de tareas auditables, a las que se ha asignado al menos una tarea, con la indicación que qué tarea(s) tiene y a qué tipo pertenecen, todas las cuales no hayan tenido ningún avance.
Por otro lado se vuelve a cruzar con todas para conocer las tareas que efectivamente hayan tenido un avance (en principio esto debería dar NULL lógicamente porque son incompatibles).
Luego tienes la segunda consulta, que en esencia parecer ser idéntica a la original, con sólo un cambio de orden de las tablas, como en el punto anterior...

Mira, si lo que quieres es obtener la lista de tareas auditables, a las que se ha asignado al menos una tarea, con la indicación que qué tarea(s) tiene y a qué tipo pertenecen, todas las cuales hayan tenido o no algún avance, la sentencia que debería lograrlo es la sentencia original con sólo un cambio:
Código MySQL:
Ver original
  1.     AU.ID_auditoria,
  2.     TT.`Tipo de tarea`
  3.   FROM
  4.     auditorias AU
  5.     INNER JOIN `asignacion de tareas` AT ON AU.ID_auditoria = AT.Auditoria
  6.     INNER JOIN tareas TA ON TA.Tarea = AT.ID_tareas
  7.     INNER JOIN `tipos de tareas` TT ON TA.Tipo = TT.ID_tipo_tarea
  8.     LEFT JOIN avance AV ON AT.Tarea = AV.ID_asignacion
  9.     AV.ID_avance OR AV.ID_avance IS NULL
  10.   ORDER BY AU.ID_auditoria, TT.ID_tipo_tarea
  11.   GROUP BY AU.ID_auditoria, TT.ID_tipo_tarea;
o bien hacer un UNION con dos consultas con las condiciones alternadas...

Explícame qué es exactamente lo que debe mostrar el reporte, a ver si por allí podemos reducir este código a algo menos redundante.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)