Uniones de tablas en Oracle

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)
Uniones de tablas en Oracle

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.

Escribir un comentario