Contenido de esta guía
Qué conserva FULL OUTER JOIN
FULL OUTER JOIN devuelve las filas que coinciden y, además, las filas sin pareja de la izquierda y de la derecha. En cada ausencia, las columnas del lado que falta se rellenan con NULL.
Resulta útil para conciliaciones: comparar inventarios, listas esperadas frente a actividad real o registros de dos sistemas que deberían estar sincronizados.
Sintaxis básica
SELECT columnas
FROM conjunto_a AS a
FULL OUTER JOIN conjunto_b AS b
ON b.clave = a.clave;FULL JOIN y FULL OUTER JOIN son formas equivalentes en los motores que admiten este operador.
Ejemplo guiado
WITH esperados(id, nombre) AS (
VALUES (1, 'Ana'), (6, 'Pablo'), (9, 'Nora')
), actividad(cliente_id, ultima_fecha) AS (
VALUES (1, '2025-05-10'),
(7, '2025-05-23'),
(9, '2025-06-01')
)
SELECT e.id AS esperado_id,
e.nombre,
a.cliente_id,
a.ultima_fecha
FROM esperados AS e
FULL OUTER JOIN actividad AS a
ON a.cliente_id = e.id
ORDER BY COALESCE(e.id, a.cliente_id);| esperado_id | nombre | cliente_id | ultima_fecha |
|---|---|---|---|
| 1 | Ana | 1 | 2025-05-10 |
| 6 | Pablo | NULL | NULL |
NULL | NULL | 7 | 2025-05-23 |
| 9 | Nora | 9 | 2025-06-01 |
Ana y Nora coinciden. Pablo solo está en la lista esperada; el identificador 7 solo aparece en la actividad. El resultado permite ver las tres situaciones en una consulta.
Error frecuente
Filtrar después y borrar una de las ausencias
Una condición como WHERE a.ultima_fecha >= '2025-06-01' elimina las filas cuyo lado derecho es NULL. Si necesitas conservarlas, expresa la regla con cuidado, por ejemplo incluyendo OR a.ultima_fecha IS NULL, o filtra antes de unir.
Comprueba lo aprendido
Clasifica cada fila
Añade una columna situacion que indique 'coincide', 'solo_esperados' o 'solo_actividad'.
CASE.e.id IS NULL, la fila existe solo en actividad.a.cliente_id IS NULL, existe solo en esperados.Solución razonada
CASE
WHEN e.id IS NULL THEN 'solo_actividad'
WHEN a.cliente_id IS NULL THEN 'solo_esperados'
ELSE 'coincide'
END AS situacionLos NULL creados por la unión indican qué lado no aportó una fila. La condición de coincidencia debe usar claves que no sean nulas.
Compatibilidad entre motores
PostgreSQL, SQL Server y SQLite desde 3.39.0 admiten FULL OUTER JOIN. La documentación de MySQL 8.4 describe uniones externas LEFT y RIGHT, pero no un operador FULL; allí suele construirse un resultado equivalente combinando consultas, y debe probarse con especial cuidado para no duplicar coincidencias.
Qué debes recordar
- Conserva filas coincidentes y no coincidentes de ambos lados.
- Los
NULLmuestran qué conjunto no aportó pareja. - Es útil para conciliaciones y detección de diferencias.
- La compatibilidad directa no es igual en todos los motores.