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:
| Variedad | Precio |
|---|---|
| Fuji | 5.00 |
| Gala | 6.00 |
| 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

tiziana
julio 8, 2008
Hola estoy haciendo un join de 3 tablas y se me estan duplicando datos quisiera saber como hacer para arreglar dicho error si me pudieran ayuda gracias
juan
mayo 19, 2009
tiziana, asegurate que comples con la regla principal:
el numero de enlaces debe ser igual al numero de tablas menos uno (como minimo)