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:
| Variedad | Precio |
|---|---|
| Fuji | 5.00 |
| Gala | 6.00 |
| Variedad | Precio |
|---|---|
| Valencia | 4.00 |
| Navel | 5.00 |
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 |
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 |
| 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
Suscribete al feed aquí
Una respuesta para "Como simular un FULL OUTER JOIN en MySQL"
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
Comentarios: