En publicación voy a intentar emular un FULL OUTER JOIN para aquellos DBMS que no lo soporten, por ejemplo, MySQL.

Para empezar recordemos que un FULL OUTER JOIN es así como un LEFT JOIN y RIGHT JOIN a la vez. O bien, como vimos en Inner, Outer, Natural & Cross JOINs, FULL OUTER JOIN combina los resultados de dos o más tablas, tengan o no coincidencia entre sí.

Veamos un ejemplo demostrativo:

  • Disponemos de dos tablas, manzanas y naranjas:
Manzanas
Variedad Precio
Fuji 5.00
Gala 6.00
Naranjas
Variedad Precio
Valencia 4.00
Navel 5.00
  • Si realizamos un LEFT JOIN por precio, tenemos:
SELECT * FROM manzanas a LEFT OUTER JOIN naranjas o ON a.precio = o.precio
Variedad Precio Variedad Precio
Fuji 5 Navel 5
Gala 6 NULL NULL
  • y con un RIGHT JOIN:
SELECT * FROM manzanas a RIGHT OUTER JOIN naranjas o ON a.precio = o.precio
Variedad Precio Variedad Precio
NULL NULL Valencia 4
Fuji 5 Navel 5
  • Si nuestro DBMS soportara FULL OUTER JOIN, el resultado que obtendriamos sería el siguiente:
Variedad Precio Variedad Precio
Fuji 5 Navel 5
Gala 6 NULL NULL
NULL NULL Valencia 4

Para simular el FULL OUTER JOIN, lo haremos haciendo una combinación entre JOIN y UNION. Si tu DBMS no soporta UNION deberás arreglártelas de otra forma (como lo puedes ver en el artículo original)

Veamos el siguiente ejemplo:

SELECT * FROM manzanas a LEFT JOIN naranjas o ON a.precio=o.precio
UNION
SELECT * FROM manzanas a RIGHT JOIN naranjas o ON a.precio=o.precio

Esta consulta da los resultados deseados en este caso, pero no para todos los casos. Solo imagínate si hay registros duplicados. Por un lado UNION nos elimina duplicados y por otro lado, si usamos UNION ALL no trabajará como corresponde en el caso de que hayan registros intencionalmente duplicados. Es decir, hay casos donde hay registros legítimamente duplicados (registros duplicados en una misma tabla) y registros duplicados que no deberían aparecer son parte de la unión de ambas tablas.

Por lo tanto, la segunda alternativa es utilizar UNION ALL y un JOIN con exclusión. ¿Que es esto? será mejor que veamos el ejemplo:

SELECT * FROM manzanas a
   LEFT JOIN naranjas o ON a.precio=o.precio
UNION ALL
SELECT * FROM manzanas a
   RIGHT JOIN naranjas o ON a.precio=o.precio
WHERE a.price IS NULL;

Como se puede ver utilizamos UNION ALL para incluir duplicados (pero solo los duplicados “legales”), y para eliminar de la segunda consulta, los resultados incluidos en la primera, excluimos los mismos con el WHERE … IS NULL.

Vía: Xaprb