Ver Mensaje Individual
  #13 (permalink)  
Antiguo 28/02/2013, 17:12
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, 4 meses
Puntos: 2658
Respuesta: Error en LEFT JOIN

Vamos a desglosar la consulta parte por parte para ver si se entiende. Por lo que he visto, has copiado en dos ocasiones lo que te proponemos, pero no al pie de la letra.
Ten en cuenta que al adaptar una consulta, debes respetar la lógica que se aplica, y me parece que el problema puede deberse a que algo no está bien entendido, o no fue respetado.
La consulta que te propusimos fue esencialmente esta (la restructure con comentarios para que se entienda mejor):
Código MySQL:
Ver original
  1.     mar.cod_aro,
  2.     mar.des_aro,
  3.     mar.cod_medida,
  4.     tma.nom_marca,
  5.     mcxe.id
  6. FROM maros mar
  7.     INNER JOIN
  8.     tmarcas tma ON tma.cod_marca = mar.cod_marca
  9.     # Con esto sólo devolvera lo que hay en comun en ambas tablas.
  10.     LEFT JOIN
  11.     mcompoxequipo mcxe ON
  12.         (mcxe.cod_componente = mar.cod_aro
  13.         AND  
  14.         tma.cod_tipocomponente = mcxe.cod_tipocomponente)
  15.     # Esto devuelve todo lo devuelto por las dos primeras tablas
  16.     # y todo lo que coincida o no con la tercera, es decir
  17.     # que en la tercera deberían aparecer NULL donde no hay coincidencias.
  18.     # Los parentesis son para asegurar que compare ambas condiciones como una sola.
  19.     (tma.cod_tipocomponente =3
  20.     OR  
  21.     mcxe.cod_tipocomponente IS NULL)
  22.     # Esto se pone entre parentesis para que se evalue como una sola cosa:
  23.     # Que el tma.cod_tipocomponente sea igual a 3, o bien que sea NULL.
  24.     # No es necesario definir que mcxe.cod_tipocomponente sea 3 (como ponias)
  25.     # porque siendo esa condicion esta implícita en la relacion del FROM.
  26.     # Se pide que sean iguales, que sean iguales a 3 o NULL.
  27.     AND mcxe.cod_eq='72'
  28.     # Esta condición sólo se puede dar si coinciden la tabla derivada y la tercer tabla.
  29. ORDER BY tma.nom_marca, mar.des_aro
Ahora bien, si sucede que el campo mcxe.cod_tipocomponente puede ser NULL por un error de consistencia, entonces deberíamos replantar la condición del WHERE así:
Código MySQL:
Ver original
  1.     mar.cod_aro,
  2.     mar.des_aro,
  3.     mar.cod_medida,
  4.     tma.nom_marca,
  5.     mcxe.id
  6. FROM maros mar
  7.     INNER JOIN
  8.     tmarcas tma ON tma.cod_marca = mar.cod_marca
  9.     LEFT JOIN
  10.     mcompoxequipo mcxe ON
  11.         (mcxe.cod_componente = mar.cod_aro
  12.         AND  
  13.         tma.cod_tipocomponente = mcxe.cod_tipocomponente)
  14.     (tma.cod_tipocomponente =3
  15.     OR  
  16.     mcxe.id IS NULL)
  17.     AND mcxe.cod_eq='72'
  18. ORDER BY tma.nom_marca, mar.des_aro
Si esto último no funciona, entonces yo empezaría a pensar que realmente hay un problema de datos sucios.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)