Cuando trabajas con múltiples tablas en una base de datos, llega el momento en el que necesitas realizar uniones de tablas en Oracle. En este artículo, vamos a repasar las diferentes formas de relacionar tablas en Oracle, explicando cada tipo de unión con ejemplos sencillos y prácticos.
Las uniones (JOIN
) permiten consultar datos de dos o más tablas a la vez, relacionándolos mediante una o varias columnas. Son una parte fundamental del lenguaje SQL y dominarlas te permitirá construir consultas mucho más potentes y eficientes.
Datos de ejemplo
Antes de comenzar, estos son los datos base con los que trabajaremos:
-- www.MiguelTroyano.com CREATE TABLE empleados ( id_empleado NUMERIC(2,0), id_departamento NUMERIC(2,0), nombre VARCHAR(50), puesto VARCHAR(50), fecha_alta DATE, sueldo INTEGER ); INSERT INTO empleados VALUES (1,1,'Miguel Troyano','Analista',TO_DATE('26/09/1986','DD/MM/YYYY'),60000), (2,2,'Ismael Troyano','Analista',TO_DATE('01/01/2001','DD/MM/YYYY'),60000), (3,2,'Jose Troyano','Alta Dirección',TO_DATE('01/01/2001','DD/MM/YYYY'),80000), (4,3,'Pilar Redondo','Alta Dirección',TO_DATE('02/02/2002','DD/MM/YYYY'),80000);
Y la tabla departamentos
:
-- www.MiguelTroyano.com CREATE TABLE departamentos ( id_departamento NUMERIC(2,0), nombre_departamento VARCHAR(50) ); INSERT INTO departamentos VALUES (1, 'Recursos Humanos'), (2, 'Tecnología');
Tipos de uniones en Oracle
En Oracle, puedes usar diferentes tipos de uniones dependiendo del resultado que quieras obtener. Vamos con los principales:
- INNER JOIN: solo los registros con coincidencia en ambas tablas
- LEFT JOIN: todos los registros de la primera tabla que coincidan con la segunda
- RIGHT JOIN: todos los registros de la segunda tabla que coincidan con la primera
- FULL OUTER JOIN: todos los registros de ambas tablas, coincidan o no
- CROSS JOIN: combinación de todos los registros entre ambas tablas
- JOIN con USING: simplificación cuando la columna coincide (normalmente sin uso)
- NATURAL JOIN: unión automática por columnas con nombre idéntico (normalmente sin uso)

INNER JOIN: solo los registros con coincidencia en ambas tablas
Este tipo de unión devuelve únicamente aquellas filas en las que hay coincidencia entre ambas tablas. Es la unión más común y se utiliza cuando solo interesa obtener resultados válidos en ambas direcciones.
SELECT e.nombre, d.nombre_departamento FROM empleados e INNER JOIN departamentos d ON e.id_departamento = d.id_departamento;

Esta consulta muestra únicamente los empleados cuyo id_departamento
coincide con algún valor existente en la tabla departamentos
. Si un empleado tiene un id_departamento
que no aparece en esa tabla, no será incluido en el resultado.
LEFT JOIN: todos los registros de la primera tabla que coincidan con la segunda
El LEFT JOIN
devuelve todos los registros de la primera tabla (a la izquierda del JOIN), y completa con datos de la segunda solo cuando hay coincidencias. Si no hay coincidencia, se devuelven NULL
en las columnas de la segunda tabla.
SELECT e.nombre, d.nombre_departamento FROM empleados e LEFT JOIN departamentos d ON e.id_departamento = d.id_departamento;

Aquí se devuelven todos los empleados. Para cada uno, se busca su id_departamento
en la tabla departamentos
. Si se encuentra, se muestra el nombre del departamento; si no, esa columna aparece como NULL
.
RIGHT JOIN: todos los registros de la segunda tabla que coincidan con la primera
El RIGHT JOIN
devuelve todos los registros de la segunda tabla (la de la derecha), y completa con datos de la primera cuando hay coincidencia. Si no la hay, se devuelven NULL
en las columnas de la primera tabla.
SELECT d.nombre_departamento, e.nombre FROM empleados e RIGHT JOIN departamentos d ON e.id_departamento = d.id_departamento;

Esta consulta devuelve todos los departamentos. En cada fila se muestra también el nombre del empleado asociado, si existe.
FULL OUTER JOIN: todos los registros de ambas tablas, coincidan o no
El FULL OUTER JOIN
devuelve todos los registros de ambas tablas, uniendo aquellos que coinciden y completando con NULL
en los que no lo hacen.
SELECT e.nombre, d.nombre_departamento FROM empleados e FULL OUTER JOIN departamentos d ON e.id_departamento = d.id_departamento;

Se combinan todos los empleados y todos los departamentos. Si hay coincidencia por id_departamento
, se muestra el resultado combinado.
CROSS JOIN: combinación de todos los registros entre ambas tablas
El CROSS JOIN
devuelve el producto cartesiano de ambas tablas. Es decir, combina cada fila de la primera con todas las filas de la segunda.
SELECT e.nombre, d.nombre_departamento FROM empleados e CROSS JOIN departamentos d;

Se genera un producto cartesiano: cada empleado se combina con cada departamento, sin ninguna condición de relación.
JOIN con USING: simplificación cuando la columna coincide
Cuando las dos tablas comparten una columna con el mismo nombre, se puede usar USING
para simplificar la unión. Solo se debe indicar el nombre de esa columna común.
SELECT e.nombre, d.nombre_departamento FROM empleados e JOIN departamentos d USING (id_departamento);

Al tener ambas tablas una columna llamada id_departamento
, se puede usar USING
en lugar de ON
.
NATURAL JOIN: unión automática por columnas con nombre idéntico
El NATURAL JOIN
detecta automáticamente las columnas que tienen el mismo nombre en ambas tablas y realiza la unión basándose en ellas, sin necesidad de especificarlo.
SELECT nombre, nombre_departamento FROM empleados NATURAL JOIN departamentos;

Oracle detecta automáticamente las columnas con el mismo nombre (id_departamento
) y realiza la unión por ellas.
Conclusión
Cada tipo de unión en Oracle tiene un comportamiento específico que depende de si hay coincidencias entre los datos de ambas tablas. Entender cómo se combinan las filas en cada caso es clave para construir consultas precisas.
Para más información, puedes consultar la documentación oficial de ORACLE.