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 mar.cod_aro,
mar.des_aro,
mar.cod_medida,
tma.nom_marca,
mcxe.id
tmarcas tma
ON tma.cod_marca
= mar.cod_marca
# Con esto sólo devolvera lo que hay en comun en ambas tablas.
(mcxe.cod_componente = mar.cod_aro
tma.cod_tipocomponente = mcxe.cod_tipocomponente)
# Esto devuelve todo lo devuelto por las dos primeras tablas
# y todo lo que coincida o no con la tercera, es decir
# que en la tercera deberían aparecer NULL donde no hay coincidencias.
# Los parentesis son para asegurar que compare ambas condiciones como una sola.
(tma.cod_tipocomponente =3
mcxe.cod_tipocomponente
IS NULL) # Esto se pone entre parentesis para que se evalue como una sola cosa:
# Que el tma.cod_tipocomponente sea igual a 3, o bien que sea NULL.
# No es necesario definir que mcxe.cod_tipocomponente sea 3 (como ponias)
# porque siendo esa condicion esta implícita en la relacion del FROM.
# Se pide que sean iguales, que sean iguales a 3 o NULL.
# Esta condición sólo se puede dar si coinciden la tabla derivada y la tercer tabla.
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 mar.cod_aro,
mar.des_aro,
mar.cod_medida,
tma.nom_marca,
mcxe.id
tmarcas tma
ON tma.cod_marca
= mar.cod_marca
(mcxe.cod_componente = mar.cod_aro
tma.cod_tipocomponente = mcxe.cod_tipocomponente)
(tma.cod_tipocomponente =3
Si esto último no funciona, entonces yo empezaría a pensar que realmente hay un problema de datos sucios.