Lección 5.5: FULL OUTER JOIN - Combinando Todo de Ambas Tablas
El FULL OUTER JOIN es el tipo de unión más inclusivo. Devuelve todas las filas cuando hay una coincidencia en cualquiera de las tablas, ya sea la izquierda o la derecha. Es esencialmente una combinación de un LEFT JOIN y un RIGHT JOIN.
¿Qué es un FULL OUTER JOIN?
Un FULL OUTER JOIN crea un conjunto de resultados que incluye todos los registros de ambas tablas.
- Si una fila coincide, las columnas de ambas tablas se completan.
- Si hay una fila en la tabla izquierda sin coincidencia en la derecha, las columnas de la derecha son NULL.
- Si hay una fila en la tabla derecha sin coincidencia en la izquierda, las columnas de la izquierda son NULL.
Visualización:
Tabla A (potential_leads) Tabla B (active_clients)
+----+----------+ +----+----------+
| id | nombre | | id | estado |
+----+----------+ +----+----------+
| 1 | Alice | <--------> | 1 | Activo | (¡Coincidencia!)
| 2 | Bob | <--------? | NULL | (Solo lead, aún sin cuenta)
| NULL | <--------> | 3 | Activo | (Cliente solo, no en la lista de leads)
+----+----------+ +----+----------+
Sintaxis de FULL OUTER JOIN
SELECT
table1.column1,
table2.column2
FROM
table1
FULL OUTER JOIN
table2 ON table1.common_column = table2.common_column;
Nota Importante sobre el Soporte de Bases de Datos: No todos los sistemas de bases de datos soportan
FULL OUTER JOINde manera nativa.
- PostgreSQL, SQL Server y Oracle lo soportan.
- MySQL y MariaDB NO lo soportan.
Solución Alternativa para MySQL/MariaDB
Dado que MySQL no tiene FULL OUTER JOIN, los desarrolladores logran el mismo resultado combinando un LEFT JOIN y un RIGHT JOIN usando el operador UNION:
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.id;
Ejemplo Práctico
Imagina que estamos fusionando datos de dos sucursales diferentes. La Sucursal A tiene su propia lista de clientes, y la Sucursal B tiene la suya. Queremos una lista completa de todos los clientes en ambas sucursales, mostrando dónde se superponen.
SELECT
a.customer_name AS branch_a_name,
b.customer_name AS branch_b_name
FROM
branch_a_customers AS a
FULL OUTER JOIN
branch_b_customers AS b ON a.customer_id = b.customer_id;
Puntos Clave de Esta Lección
- FULL OUTER JOIN devuelve todos los registros de ambas tablas.
- Utiliza NULLs para llenar los espacios donde no se encuentra coincidencia en ninguno de los lados.
- Es la mejor herramienta para la sincronización de bases de datos y para encontrar discrepancias entre dos listas.
- Si tu base de datos no lo soporta (como MySQL), utiliza un UNION de un LEFT y un RIGHT join.